今天第二次做BC,不习惯hdu的oj,CE过2次。。。

1002 Clarke and problem

Codeforces Round #319 (Div. 2) B Modulo Sum思路差不多,

将a[i]对p取余数,最后得到0的方案总数即使答案,dp转移,一个状态方案总数等于能转移过来的状态方案数之和

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std; #define PB push_back
#define MP make_pair
#define fi first
#define se second #define cer(x) cout<<#x<<'='<<endl
typedef long long ll;
const int maxn = ;
int dp[][maxn]; //#define LOCAL
const int MOD = 1e9+; int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int T; scanf("%d",&T);
while(T--){
int n,p; scanf("%d%d",&n,&p);
//fill(dp[0],dp[0]+p,0);
memset(dp[],,sizeof(dp[]));
dp[][] = ;
for(int i = ; i < n; i++){
int c = i&,nx = (i&)^;
//fill(dp[nx],dp[nx]+p,0);
memcpy(dp[nx],dp[c],sizeof(dp[nx]));
int a; scanf("%d",&a);
a %= p; if(a<) a += p; //G++编译器负数取模还是负数,在这里RE了几次
for(int j = ; j < p; j++){
if(dp[c][j]){
int t = (j+a)%p;
dp[nx][t] = (dp[nx][t]+ dp[c][j])%MOD;
}
}
}
printf("%d\n",dp[n&][]);
}
return ;
}

1003  Clarke and puzzle

熟悉NIM游戏的结论和SG函数思路上并不难。

卡时间卡的太紧了,按照官方题解做法980ms过。。。把memset换成for,890ms

自信地写了个二维线段树被卡。写BIT还遇到一些奇怪的错误。

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std; #define PB push_back
#define MP make_pair
#define fi first
#define se second #define cer(x) cout<<#x<<'='<<endl
typedef long long ll; const int maxn = ; int C[maxn][maxn],n,m,c[maxn][maxn];
#define lb(x) ((x)&-(x)) int sum(int x,int y){
int r = ;
for(int i=x;i>;i-=lb(i)) //for(; x>0; x-=lb(x)) 奇怪的错误,写成这样T了
for(int j=y;j>;j-=lb(j))
r ^= C[i][j];
return r;
}
void add(int x,int y,int val){
for(int i=x;i<=n;i+=lb(i))
for(int j=y;j<=m;j+=lb(j))
C[i][j] ^= val;
} //#define LOCAL int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int T; scanf("%d",&T);
while(T--){
int q; scanf("%d%d%d",&n,&m,&q); //memset(C,0,sizeof(C));
for(int i = ; i <= n; i++){
//fill(C[i]+1,C[i]+1+m,0);
for(int j = ; j <= m; j++) C[i][j] = ;
} for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
scanf("%d",c[i]+j);
add(i,j,c[i][j]);
}
}
for(int i = ; i < q; i++){
int op; scanf("%d",&op);
if(op == ){
int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
puts(sum(x2,y2)^sum(x2,y1-)^sum(x1-,y2)^sum(x1-,y1-)?"Yes":"No");
}else {
int x,y,v; scanf("%d%d%d",&x,&y,&v);
add(x,y,c[x][y]^v);
c[x][y] = v;
}
}
}
return ;
}

重新改了时限后二维线段树过了

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
using namespace std; #define PB push_back
#define MP make_pair
#define fi first
#define se second #define cer(x) cout<<#x<<'='<<endl
typedef long long ll; const int maxn = <<,N = ; int sx[maxn][maxn],n,m;
int c[N][N];
int xo,xleaf,x1,y1,x2,y2,x,y,v,vsx; #define lid (id<<1)
#define rid (id<<1|1)
void query1D(int id = ,int l = ,int r = m)
{
if(y1 <= l && r <= y2){
vsx ^= sx[xo][id];
}else {
int mid = (l+r)>>;
if(y1 <= mid) query1D(lid,l,mid);
if(mid < y2) query1D(rid,mid+,r);
}
} void query2D(int id = ,int l = ,int r = n)
{
if(x1 <= l && r <= x2) { xo = id; query1D(); }
else {
int mid = (l+r)>>;
if(x1 <= mid) query2D(lid,l,mid);
if(mid < x2) query2D(rid,mid+,r);
}
} void modify1D(int id = , int l = , int r = m)
{
if(l == r){
if(xleaf) { sx[xo][id] = v; return; }
sx[xo][id] = sx[xo<<][id]^sx[xo<<|][id];
}else {
int mid = (l+r)>>;
if(y <= mid) modify1D(lid,l,mid);
else modify1D(rid,mid+,r);
sx[xo][id] = sx[xo][lid]^sx[xo][rid];
}
} void modify2D(int id = , int l = , int r = n)
{
if(l==r) { xo = id; xleaf = ; modify1D(); }
else {
int mid = (l+r)>>;
if(x<=mid) modify2D(lid,l,mid);
else modify2D(rid,mid+,r);
xo = id; xleaf = ; modify1D();
}
} void build1D(int id = ,int l = ,int r = m)
{
if(l == r) {
if(xleaf) { sx[xo][id] = c[x][l]; return; }
sx[xo][id] = sx[xo<<][id]^sx[xo<<|][id];
}
else {
int mid = (l+r)>>,lc = lid,rc = rid;
build1D(lc,l,mid);
build1D(rc,mid+,r);
sx[xo][id] = sx[xo][lc]^sx[xo][rc];
}
} void build2D(int id = , int l = , int r = n)
{
if(l == r){ xo = id; xleaf = ; x = l; build1D(); }
else {
int mid = (l+r)>>;
build2D(lid,l,mid);
build2D(rid,mid+,r);
xo = id; xleaf = ; build1D();
}
} inline int read()
{
char c;
while((c=getchar())<''||c>'');
int ret=c-'';
while((c = getchar())>=''&&c<='') ret = ret*+(c-'');
return ret;
} //#define LOCAL int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int T; scanf("%d",&T);
while(T--){
n = read(); m = read();
int q = read();
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
c[i][j] = read();
}
}
build2D();
while(q--){
if(read() == ){
x1 = read(); y1= read(); x2 = read(); y2 = read();
vsx = ;
query2D();
puts(vsx?"Yes":"No");
}else {
x = read(); y = read(); v = read();
modify2D();
}
}
}
return ;
}

BestCoder Round #56 1002 Clarke and problem 1003 Clarke and puzzle (dp,二维bit或线段树)的更多相关文章

  1. 暴力+降复杂度 BestCoder Round #39 1002 Mutiple

    题目传送门 /* 设一个b[]来保存每一个a[]的质因数的id,从后往前每一次更新质因数的id, 若没有,默认加0,nlogn复杂度: 我用暴力竟然水过去了:) */ #include <cst ...

  2. 矩阵快速幂---BestCoder Round#8 1002

    当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算.我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n)   f(n-1)] = [f(n ...

  3. 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

    题目传送门 /* 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 当然有可能两个数和超过p,那么an的值最优,每 ...

  4. Manacher BestCoder Round #49 ($) 1002 Three Palindromes

    题目传送门 /* Manacher:该算法能求最长回文串,思路时依据回文半径p数组找到第一个和第三个会文串,然后暴力枚举判断是否存在中间的回文串 另外,在原字符串没啥用时可以直接覆盖,省去一个数组空间 ...

  5. 二分图判定+点染色/并查集 BestCoder Round #48 ($) 1002 wyh2000 and pupil

    题目传送门 /* 二分图判定+点染色:因为有很多联通块,要对所有点二分图匹配,若不能,存在点是无法分配的,no 每一次二分图匹配时,将点多的集合加大最后第一个集合去 注意:n <= 1,no,两 ...

  6. BestCoder Round #29 1003 (hdu 5172) GTY's gay friends [线段树 判不同 预处理 好题]

    传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Ot ...

  7. hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]

    传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131 ...

  8. BestCoder Round #56 /hdu5464 dp

    Clarke and problem 问题描述 克拉克是一名人格分裂患者.某一天,克拉克分裂成了一个学生,在做题. 突然一道难题难到了克拉克,这道题是这样的: 给你nn个数,要求选一些数(可以不选), ...

  9. HDU5465/BestCoder Round #56 (div.2) 二维树状数组

    Clarke and puzzle 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一个数c_{i, j}c​i ...

随机推荐

  1. 优酷电视剧爬虫代码实现一:下载解析视频网站页面(4)补充: Java正则表达式Matcher.group(int group)相关类解析

    在Java正则表达式的相关类Matcher中,有如下几个方法: - int groupCount() - String group(int group) - int start(int group)  ...

  2. ACM-ICPC2018南京网络赛 AC Challenge(一维状压dp)

    AC Challenge 30.04% 1000ms 128536K   Dlsj is competing in a contest with n (0 < n \le 20)n(0<n ...

  3. python + requests实现的接口自动化框架详细教程

    前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自 ...

  4. 【异步编程】Part2:掌控SynchronizationContext避免deadlock

    引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...

  5. Python之路(四十一):通过项目来深入理解tornado

    Tornado之路   引子 与其感慨路难行,不如马上出发 目录 通过项目来深入理解tornado(一):tornado基础回顾 通过项目来深入理解tornado(二):AsyncHttpClient ...

  6. 用 _tcscmp 替代 strcmp 或 wcscmp

    转自:http://blog.csdn.net/eickandy/article/details/50081537 好处:是可以不管是用unicode 编码还是其他 ,代码都不用改. C++标准库函数 ...

  7. ue4 tags 与 cast

    父类设置tags,子类默认自动添加这个tags 子类可以强行删除父类的tags,这时如果把子类cast为父类,一样找不到这个tags 综上,要找到一个actor的tags,那么这个actor上就一定要 ...

  8. 51nod1255(栈)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1255 题意:中文题诶- 思路:对于当前字符 s[i],若其不在 ...

  9. spring事物回滚机制 (事务异常回滚,捕获异常不抛出就不会回滚)

    当异常被捕获catch的时候,spring的事物则不会回滚 为什么不会滚呢??  spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常 ...

  10. sed命令用法

    Sed 简介 sed 是一种新型的,非交互式的编辑器.它能执行与编辑器 vi 和 ex 相同的编辑任务.sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令.指定文件名,然后在屏幕上查 ...