今天第二次做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. HDU 5547 Sudoku (暴力)

    题意:数独. 析:由于只是4*4,完全可以暴力,要注意一下一些条件,比如2*2的小方格也得是1234 代码如下: #pragma comment(linker, "/STACK:102400 ...

  2. nodejs安装使用express

    1.用Express 应用程序生成器 express-generator 快速搭建express框架 1.1安装: npm install express-generator -g 1.2 生成目录: ...

  3. GDB 远程调试Linux (CentOS)

    1.引用: https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development/ 注意安装gdbserv ...

  4. Eureka 代码详解

    看过之前文章的朋友们,相信已经对Eureka的运行机制已经有了一定的了解.为了更深入的理解它的运作和配置,下面我们结合源码来分别看看服务端和客户端的通信行为是如何实现的.另外写这篇文章,还有一个目的, ...

  5. Mac 下nginx 环境的配置

    这个是在度娘那里学来的. 因为是使用brew所以先安装: 安装命令如下:curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo ...

  6. 取消eclipse英文单词拼写验证

    依次点击Preferences->General->Editors->TexEditors->Spelling->Enable Spell Checkingt , 如下图 ...

  7. 洛谷P4407 [JSOI2009]电子字典

    题目描述 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子字典能够从一定 ...

  8. React `controlled` 及 `uncontrolled` 组件

    通过 props 来设置其 value 值的组件便是一种 controlled 组件.典型的 form 表单中,像 输入框 <input> 下拉框 <select> 多选框 & ...

  9. docker安装及概述

    相关快捷键 退出:Ctrl-D or exit detach:Ctrl-P + Ctrl-Q Docker 核心技术 1.Namespace — 实现Container的进程.网络.消息.文件系统和主 ...

  10. Selenium 开源书(一): Selenium历史

    Selenium历史 Selenium最初由Jason Huggins于2004年开发,作为ThoughtWorks的内部工具.Huggins后来加入了ThoughtWorks的其他程序员和测试人员, ...