10.9NOIP模拟题
/*
big模拟
细节不少
remove表示这个玩意儿在这一秒有没有移动
注意在一秒内所有小葱一起移动,所以如果一个一个处理
别忘了“错位”这种情况
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 1001 using namespace std;
int n,m,T,k,ans;
int belong[N][N],cnt[N][N];
struct C{
int x,y,flag1,turn,f,remove;
}p[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} bool can(int x)
{
if(p[x].remove==) return true;
if(p[x].x== && p[x].turn==) return true;
if(p[x].x==n && p[x].turn==) return true;
if(p[x].y== && p[x].turn==) return true;
if(p[x].y==m && p[x].turn==) return true;
return false;
} void judge(int i,int o)
{
if(cnt[p[i].x][p[i].y])
{
if(can(belong[p[i].x][p[i].y]))
{
if(p[belong[p[i].x][p[i].y]].f>p[i].f) p [i].flag1=;
else p[belong[p[i].x][p[i].y]].flag1=,belong [p[i].x][p[i].y]=i;
}
else
{
belong[p[i].x][p[i].y]=i;
cnt[p[i].x][p[i].y]++;
}
}
else
{
belong[p[i].x][p[i].y]=i;
cnt[p[i].x][p[i].y]++;
}
} int main()
{
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
n=read();m=read();k=read();
for(int i=;i<=k;i++) p[i].x=read(),p[i].y=read(),
p[i].turn=read(),p[i].f=read();
T=read();
for(int i=;i<=k;i++)
belong[p[i].x][p[i].y]=i,cnt[p[i].x][p[i].y]++; while(T--)
{
for(int i=;i<=k;i++) p[i].remove=;
for(int i=;i<=k;i++)
{
if(p[i].flag1) continue;
if(p[i].turn==)
{
if(p[i].x>)
{
cnt[p[i].x][p[i].y]--;
if(belong[p[i].x][p[i].y]==i)
belong[p[i].x][p[i].y]=;
p[i].x--;
judge(i,);p[i].remove=;
}
else {p[i].turn=;p [i].remove=;continue;}
}
if(p[i].turn==)
{
if(p[i].x<n)
{
cnt[p[i].x][p[i].y]--;
if(belong[p[i].x][p[i].y]==i)
belong[p[i].x][p[i].y]=;
p[i].x++;
judge(i,);p[i].remove=;
}
else {p[i].turn=;p[i].remove=;continue;}
}
if(p[i].turn==)
{
if(p[i].y>)
{
cnt[p[i].x][p[i].y]--;
if(belong[p[i].x][p[i].y]==i)
belong[p[i].x][p[i].y]=;
p[i].y--;
judge(i,);p[i].remove=;
}
else {p[i].turn=;p [i].remove=;continue;}
}
if(p[i].turn==)
{
if(p[i].y<m)
{
cnt[p[i].x][p[i].y]--;
if(belong[p[i].x][p[i].y]==i)
belong[p[i].x][p[i].y]=;
p[i].y++;
judge(i,);p[i].remove=;
}
else {p[i].turn=;p [i].remove=;continue;}
}
}
}
for(int i=;i<=k;i++) printf("%d %d\n",p[i].x,p[i].y);
fclose(stdin);fclose(stdout);
return ;
}
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> using namespace std; const int maxn=;
const int maxk=; int n,m,k,x[maxk],y[maxk],d[maxk],f[maxk],z[maxk],t; bool alive[maxk]; int dx[],dy[]; void move(int p)
{
x[p] += dx[d[p]];
y[p] += dy[d[p]];
if (x[p]< || x[p]>n || y[p]< || y[p]>m)
{
x[p] -= dx[d[p]];
y[p] -= dy[d[p]];
d[p] ^= ;
}
} bool cmp(int a,int b)
{
if (x[a]!=x[b]) return x[a]<x[b];
else return y[a]<y[b];
} int main()
{
dx[]=-;dx[]=;dy[]=-;dy[]=;
scanf("%d%d%d",&n,&m,&k);
for (int a=;a<=k;a++)
scanf("%d%d%d%d",&x[a],&y[a],&d[a],&f[a]);
for (int a=;a<=k;a++)
{
alive[a]=true;
z[a]=a;
}
scanf("%d",&t); for (;t--;)
{
for (int a=;a<=k;a++)
if (alive[a]) move(a);
sort(z+,z+k+,cmp); for (int a=;a<=k;)
{
int b=a,p=-;
while (x[z[b]]==x[z[a]] && y[z[b]]==y[z[a]] && b<=k)
{
if (alive[z[b]] && (p==- || f[z[b]]>f[z[p]])) p=b;
b++;
}
for (int c=a;c<b;c++)
if (p!=- && c!=p) alive[z[c]]=false;
a=b;
}
}
for (int a=;a<=k;a++)
printf("%d %d\n",x[a],y[a]); return ;
}
知道自己代码丑 std0.0
/*
题意不好懂,自行体会。
20暴力 dfs
加剪枝可能会多跑过两个点
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map> #define mod 12345 #define N 9001
using namespace std;
int n,m,flag;
long long ans;
char c[N],cur[N];
int b[N],vis[N];
map<char,int>cnt; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void dfs(int now)
{
if(now==n+)
{
for(int i=;i<=m;i++) cnt[c[i]]=;
flag=;
for(int i=;i<=n;i++) cnt[cur[i]]++;
for(int i=;i<=m;i++)
if(cnt[c[i]]%b[i] && cnt[c[i]]) flag=;
if(!flag) ans++,ans%=mod;
return;
}
for(int i=;i<=m;i++)
{
if(!vis[now]) vis[now]=,cur[now]=c[i];
dfs(now+);vis[now]=;
}
} int main()
{
freopen("too.in","r",stdin);
freopen("too.out","w",stdout);
n=read();m=read();
for(int i=;i<=m;i++) cin>>c[i]>>b[i];
dfs();ans%=mod;
printf("%lld\n",ans);
return ;
}
/*
30暴力
bitset预处理任意两点间边数 e[i][j]
然后dp dp[i]表示1->i路径数
dp[i+1]=Σdp[j]*e[j][i+1] (j<=i)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<bitset> #define N 1007
#define mod 991127
#define ll long long using namespace std;
bitset<>a;
bitset<>b;
bitset<>c;
int n,m,num[N];
ll e[N][N],dp[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
freopen("easy.in","r",stdin);
freopen("easy.out","w",stdout);
n=read();
for(int i=;i<=n;i++) num[i]=read();
for(int i=;i<=n;i++) for(int j=i+;j<=n;j++)
{
a=num[i];b=num[j];c=a&b;
e[i][j]=c.count();e[i][j]%=mod;
}
dp[]=;ll tmp=;
for(int i=;i<n;i++)
{
tmp=;
for(int j=;j<=i;j++)
{
tmp+=(dp[j]*e[j][i+])%mod;
tmp%=mod;
}
dp[i+]+=tmp;dp[i+]%=mod;
}
dp[n]%=mod;
printf("%lld\n",dp[n]);
return ;
}
/*
注意题目要求只能编号小的往大的连边
f[i]表示第i位是1的数的贡献,编号由小到大类似前缀和累计
先枚举每个点权
如果当前点第i位是1的话,那能转移到它的位置也一定是1
然后再把当前位置的贡献加上
*/
#include <bits/stdc++.h> #define MOD 991127 using namespace std ; int n ; const int MAXN = ; int a[MAXN]; int f[] ; int dp[MAXN] ; inline void update(int &a, int b) {
a += b ;
if (a >= MOD) a -= MOD ;
}
int main() { scanf("%d", &n) ;
for (int i = ; i <= n; i ++) {
scanf("%d", &a[i]) ;
} memset(f, , sizeof f); for (int i = ; i < ; i ++) {
if ((a[] >> i) & ) f[i] = ;
}
dp[] = ;
for (int i = ; i <= n; i ++) {
for (int j = ; j < ; j ++) {
if ((a[i] >> j) & ) update(dp[i], f[j]) ;
}
for (int j = ; j < ; j ++) {
if ((a[i] >> j) & ) update(f[j], dp[i]) ;
}
} printf("%d\n", dp[n]) ; }
10.9NOIP模拟题的更多相关文章
- 10.13NOIP模拟题
/* 容斥原理 考虑到a[i]要么不会太大,要么就对答案贡献很小 dfs即可 */ #include<bits/stdc++.h> #define ll long long #define ...
- 10.23NOIP模拟题
叉叉题目描述现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母 a 和第二次出现的 a 连一条线,第三次出现的和四次出现的字母 a 连一条线,第五次出现的和六次出现的字母 a ...
- 10.12NOIP模拟题(2)
/* 有谁知道这道题结论是怎么来的? 晚上问问学数学的孩子23333 */ #include<iostream> #include<cstdio> #include<cs ...
- 10.12NOIP模拟题(1)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...
- 10.11NOIP模拟题(3)
/* 可以看出,对于一段区间[L,R]如果统计了答案 若a[L]<a[R],那么当右端点往左移时答案不会更优,a[R]>a[L]同理 所以两个指针分别从头尾往中间扫那边小移哪边即可. */ ...
- 10.11NOIP模拟题(2)
/* string水过 */ #include<bits/stdc++.h> #define N 1001 using namespace std; int n,x,y,m,pre; st ...
- poj 1008:Maya Calendar(模拟题,玛雅日历转换)
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64795 Accepted: 19978 D ...
- poj 1888 Crossword Answers 模拟题
Crossword Answers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 869 Accepted: 405 D ...
- sdut 2162:The Android University ACM Team Selection Contest(第二届山东省省赛原题,模拟题)
The Android University ACM Team Selection Contest Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里 ...
随机推荐
- 使用IDEA部署Myeclipse项目----亲测有效
使用IDEA部署Myeclipse项目-----https://blog.csdn.net/u010570551/article/details/51510447
- 整体二分--BZOJ1901: Zju2112 Dynamic Rankings
n<=10000个数有m<=10000个操作,1.询问一个区间的第k小的数:2.单点修改. 带修主席树. 整体二分. 整体二分的必要条件: #include<string.h> ...
- Linux下汇编语言学习笔记3 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- Python基础之 一列表
列表模块:listlen(list):列表元素个数max(list):列表元素最大值min(list):列表元素最小值list(seq):将元组转为列表list.append(obj):列表末尾添加新 ...
- Python基础之 一 补充
三元运算: 语法:result = 值1 if 条件 else 值2 当条件为真时,result = 值1 当条件为假时,result = 值2 进制: 二进制:01 八进制:01234567 十进制 ...
- 恢复表数据的办法(delete删除可恢复,truncate不可恢复)
select * from table_name as of timestamp to_timestamp('2018-12-20 00:00:00', 'yyyy-mm-dd hh24:mi:ss' ...
- Ubuntu 16.04安装7zip的图形界面工具PeaZip
其实PeaZip不是7zip的图形界面工具,而是一整套方案,里面包括了7z格式的解压缩等. PeaZip Linux版本只有32位包,如果你使用的是64位Ubuntu系统,那么先打开终端运行下面的命令 ...
- iText输出中文的三种字体选择方式
1.使用iTextAsian.jar中的字体 BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",Bas ...
- Linux下搭建maven私服Nexus 3.2.1-01
1. 私服介绍私服是指私有服务器,是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构建.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则, ...
- 模拟用户点击弹出新页面不会被浏览器拦截_javascript技巧
原文:http://www.html5cn.com.cn/article/zxzx/3195.html 相信用过window.open的小伙伴们都遇到过被浏览器拦截导致页面无法弹出的情况:我们换下思路 ...