今天第二次做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. ACM-ICPC2018徐州网络赛 Hard to prepare(dp)

    Hard to prepare 28.63% 1000ms 262144K   After Incident, a feast is usually held in Hakurei Shrine. T ...

  2. view如何从action中取得数据和 Html辅助方法

    方式:1使用弱类型取,2,使用强类型,两者的差别在于view页面最上方声明的方式   如果使用弱类型接受来自控制器的数据,在view页面里完全不需要有任何的生命,数据可以从ViewData,ViewB ...

  3. 删除childNodes获取的文本节点

    function del_ff(elem) { var elem_child = elem.childNodes; for (var i = 0; i < elem_child.length; ...

  4. java 多线程下载文件并实时计算下载百分比(断点续传)

    多线程下载文件 多线程同时下载文件即:在同一时间内通过多个线程对同一个请求地址发起多个请求,将需要下载的数据分割成多个部分,同时下载,每个线程只负责下载其中的一部分,最后将每一个线程下载的部分组装起来 ...

  5. thinkphp5实现mysql数据库备份

    其实备份数据库说白了就是向一个.sql的文档中写入一条一条的sql命令 public function back() { $to_file_name="backsql.sql"; ...

  6. thinkphp5部署到LAMP服务器显示Access denied.

    问题:thinkphp5部署到LAMP服务器,首页正常访问,其余页面访问显示Access denied 解决:1.先把文件夹权限改为777 2. 进入服务器,改文件.将php.ini的值改成1

  7. MySQL server has gone away和Maximum execution time of 120 seconds exceeded

    今天在写采集时碰到两个问题1.MySQL server has gone away2.Maximum execution time of 120 seconds exceeded 采集程序写好运行大概 ...

  8. Web自动化测试—PO设计模式(三)

    test_case目录下面放你要执行的用例 目录结构 ui_auto_test --src --test_case --__init.py --test_login_case --pages --__ ...

  9. hibernate Restrictions用法 HibernateTemplate Hibernate结合spring

    常用方法 http://www.jb51.net/article/41541.htm ........................................... 博客分类: Hiberna ...

  10. 使用xadmin覆盖Django的admin

    安装xadmin pip 安装 pip install xadmin  可能会报错 pip install git+git://github.com/sshwsfc/xadmin.git 安装后要使用 ...