今天第二次做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. 二十五种网页加速方法和seo优化技巧

    一.使用良好的结构 可扩展 HTML (XHTML) 具有许多优势,但是其缺点也很明显.XHTML 可能使您的页面更加符合标准,但是它大量使用标记(强制性的 <start> 和 <e ...

  2. Thinkphp3.2 备份数据库和还原数据的方法

    其实Thinkphp框架并没有自带备份数据库的功能,但是细心的朋友可能会发现Thinkphp的一套内容管理系统oneThink是有备份数据库和还原数据的功能的. 所以今天我就来聊一聊,oneThink ...

  3. backgroundWorker取消后,重新开始就报错:此 BackgroundWorker 当前正忙,无法同时运行多个任务。

    使用BackgroundWorker控件,有2个按钮buttonBegin和buttonCancel.其他都正常,只是在用buttonBegin开始运行,然后点击buttonCancel取消后,到这里 ...

  4. C#中异步及winform中界面假死

    c#中可以用BeginInvoke去启动异步调用,但是有两个BeginInvoke一个是controller的BeginInvoke还有一个是委托的BeginInvoke. 主要区别是controll ...

  5. mysql由浅入深探究(四)----mysql事务详解

    什么是事务: 通俗的解释就是对数据库进行的一组完整的操作,这组完整的操作中包含一个或多个操作.解释的太low了,来点官方的:事务就是DBMS中执行的一个完整的逻辑单元,这个逻辑单元中包含一个或者多个操 ...

  6. Segment Tree Range Minimum Query.

    int rangeMinQuery(int segTree[], int qlow, int qhigh, int low, int high, int pos) { if (qlow <= l ...

  7. Android Studio如何导出可供Unity使用的aar插件详解

    http://www.cnblogs.com/xtqqkss/p/6387271.html 前言 项目之前使用Eclipse导出的jar文件来做与Android交互,最近因为工作需要需使用Androi ...

  8. 用IDEA写出第一个java web

    今天学习到如何创建新的java web,笔者使用的是IDEA,以下有详细的参考链接,如下: 参考链接:https://blog.csdn.net/zhdkong/article/details/789 ...

  9. Linux —— ps命令

    Ps命令 作用 显示瞬间进程的状态,并不动态连续: 如果想对进程进行实时监控应该用top命令: 对进程的管理,可以使用kill命令发送信号 Ps PID : 运行着的命令的进程编号 TTY : 命令所 ...

  10. Jmeter4.0----录制脚本(4)

    1.前言 Jmeter录制脚本有两种方式.1.通过第三方工具录制比如:Badboy,然后转化为jmeter可用的脚本:2.使用jmeter本身自带的录制脚本功能. 对于测试小白来说可用先使用jmete ...