2017-10-6 清北刷题冲刺班p.m
1.数组异或
- #include<iostream>
- #include<cstdio>
- #define maxn 100010
- #define mod 1000000007
- using namespace std;
- int n,a[maxn],b[maxn],c[maxn];
- int main(){
- freopen("xorarray.in","r",stdin);freopen("xorarray.out","w",stdout);
- scanf("%d",&n);
- for(int i=;i<=n;i++)scanf("%d",&a[i]);
- for(int i=;i<=n;i++)scanf("%d",&b[i]);
- c[]=a[]^b[];
- for(int i=;i<=n;i++){
- c[i]=c[i-];
- for(int j=;j<i;j++){
- c[i]+=a[i]^b[j];
- if(c[i]>=mod)c[i]-=mod;
- }
- for(int j=;j<i;j++){
- c[i]+=a[j]^b[i];
- if(c[i]>=mod)c[i]-=mod;
- }
- c[i]+=a[i]^b[i];
- if(c[i]>=mod)c[i]-=mod;
- }
- for(int i=;i<=n;i++)printf("%d ",c[i]);
- fclose(stdin);fclose(stdout);
- return ;
- }
60分 暴力
- /*
- 累计所有数二进制下的每一位0或1的个数
- 又因为是xor,所以a[j][0]*b[j][1]+a[j][1]*b[j][0]
- */
- #include<iostream>
- #include<cstdio>
- #define maxn 100010
- #define mod 1000000007
- using namespace std;
- int n,A[maxn],B[maxn];
- int a[][],b[][],C[maxn];
- int main(){
- //freopen("Cola.txt","r",stdin);
- freopen("xorarray.in","r",stdin);freopen("xorarray.out","w",stdout);
- scanf("%d",&n);
- for(int i=;i<=n;i++)scanf("%d",&A[i]);
- for(int i=;i<=n;i++)scanf("%d",&B[i]);
- for(int i=;i<=n;i++){
- for(int j=;j<=;j++){
- a[j][(A[i]>>j)&]++;
- b[j][(B[i]>>j)&]++;
- long long c=(1LL*a[j][]*b[j][]%mod+1LL*a[j][]*b[j][]%mod)%mod;
- c=c*(<<j)%mod;
- C[i]=(C[i]+c)%mod;
- }
- }
- for(int i=;i<=n;i++)printf("%d ",C[i]);
- return ;
- }
100分
2.侦探游戏(最小生成树,期望)
- #include<iostream>
- #include<cstdio>
- #include<queue>
- #include<cstring>
- #define maxn 20010
- using namespace std;
- int n,m,num,head[maxn],dis[maxn],D[maxn];
- double ans,w;
- bool v[maxn];
- struct node{
- int to,pre,v;
- }e[*];
- void Insert(int from,int to,int v){
- e[++num].to=to;
- e[num].v=v;
- e[num].pre=head[from];
- head[from]=num;
- }
- void spfa(int s1,int s2){
- queue<int>q;
- memset(v,,sizeof(v));memset(dis,/,sizeof(dis));
- v[s1]=;v[s2]=;dis[s1]=;dis[s2]=;
- if(!v[])v[]=,dis[]=,q.push();
- q.push(s1);q.push(s2);
- while(!q.empty()){
- int now=q.front();q.pop();v[now]=;
- for(int i=head[now];i;i=e[i].pre){
- int to=e[i].to;
- if(dis[to]>dis[now]+e[i].v){
- dis[to]=dis[now]+e[i].v;
- if(!v[to]){
- v[to]=;
- q.push(to);
- }
- }
- }
- }
- for(int i=;i<=n;i++){
- ans+=(double)dis[i]*w;
- }
- int k=min(D[s1],D[s2]);
- ans+=(double)k*w;
- }
- void SPFA(int s){
- queue<int>q;
- memset(v,,sizeof(v));
- memset(D,/,sizeof(D));
- v[s]=;D[s]=;
- q.push(s);
- while(!q.empty()){
- int now=q.front();q.pop();v[now]=;
- for(int i=head[now];i;i=e[i].pre){
- int to=e[i].to;
- if(D[to]>D[now]+e[i].v){
- D[to]=D[now]+e[i].v;
- if(!v[to]){
- v[to]=;
- q.push(to);
- }
- }
- }
- }
- }
- int main(){
- //freopen("Cola.txt","r",stdin);
- freopen("detective.in","r",stdin);freopen("detective.out","w",stdout);
- scanf("%d%d",&n,&m);
- w=(double)(n*(n-))/2.0;
- w=1.0/w;
- int x,y,z;
- for(int i=;i<=m;i++){
- scanf("%d%d%d",&x,&y,&z);
- Insert(x,y,z);Insert(y,x,z);
- }
- SPFA();
- for(int i=;i<=n;i++){
- for(int j=;j<i;j++){
- spfa(i,j);
- }
- }
- printf("%.2lf",ans);
- /*int sz=sizeof(head)+sizeof(e);
- cout<<sz/1048576;*/
- }
0分 暴力
- /*
- 暴力算法:
- 求一遍最小生成树,枚举两个点,想象将两个点连上权值为0的边,然后进行倍增,求两点之间最长的一条边,删除这条边,当前树上所有边权和即为此时的花费,最后除以n*(n-1)
- */
O(n^2)暴力算法
- /*
- 枚举哪一条边可以删掉,由于克鲁斯卡尔最小生成树边是按从大到小顺序选入的,所以当前讨论的这条边一定是图上最大的边,而且既然他是最小生成树的一条边,他所连接的两个集合一定是两个树,将两棵树大小进行乘法原理,累计答案 (我在胡言乱语什么)
- */
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #define maxn 20010
- #define maxm 100010
- using namespace std;
- struct node{
- int from,to,v;
- bool operator < (const node a)const{
- return v<a.v;
- }
- }e[maxm];
- int n,m,fa[maxn],s[maxn];
- unsigned long long sum,cnt;
- int find(int a){
- if(a==fa[a])return a;
- return fa[a]=find(fa[a]);
- }
- int main(){
- //freopen("Cola.txt","r",stdin);
- freopen("detective.in","r",stdin);freopen("detective.out","w",stdout);
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)fa[i]=i,s[i]=;
- for(int i=;i<=m;i++)scanf("%d%d%d",&e[i].from,&e[i].to,&e[i].v);
- sort(e+,e+m+);
- for(int i=;i<=m;i++){
- int x=find(e[i].from),y=find(e[i].to);
- if(x==y)continue;
- cnt+=1ULL*s[x]*s[y]*e[i].v;
- sum+=e[i].v;
- fa[y]=x;s[x]+=s[y];
- }
- double ans=sum-cnt/((n*(n-))/2.0);
- //double ans = sum - 2.0 * cnt / n / (n - 1);
- printf("%.2lf",ans);
- return ;
- }
100分 最小生成树
3.棋盘迷宫(分治,搜索)
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- using namespace std;
- int n,m,x1,x2,y1,y2,e[][]={{,},{,}};
- char map[][];
- bool vis[];
- int f(int x,int y){
- return (x-)*m+y;
- }
- bool BFS(){
- queue<int>q;
- memset(vis,,sizeof(vis));
- vis[f(x1,y1)]=;
- q.push(f(x1,y1));
- while(!q.empty()){
- int now=q.front();q.pop();
- int x=(now-)/m+,y=now-(x-)*m;
- for(int i=;i<;i++){
- int xx=x+e[i][],yy=y+e[i][];
- int w=f(xx,yy);
- if(xx==x2&&yy==y2)return ;
- if(xx>=&&xx<=n&&yy>=&&yy<=n&&xx<=x2&&yy<=y2&&!vis[w]&&map[xx][yy]=='.'){
- vis[w]=;
- q.push(w);
- }
- }
- }
- return ;
- }
- int main(){
- //freopen("Cola.txt","r",stdin);
- freopen("boardgame.in","r",stdin);freopen("boardgame.out","w",stdout);
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)scanf("%s",map[i]+);
- int q;
- scanf("%d",&q);
- while(q--){
- scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
- if(x2<x1||y2<y1){
- printf("No\n");
- continue;
- }
- if(x1==x2){
- bool flag=;
- for(int i=y1;i<=y2;i++){
- if(map[x1][i]=='#'){
- flag=;
- printf("No\n");break;
- }
- }
- if(!flag)printf("Yes\n");
- continue;
- }
- if(y1==y2){
- bool flag=;
- for(int i=x1;i<=x2;i++){
- if(map[i][y1]=='#'){
- flag=;
- printf("No\n");break;
- }
- }
- if(!flag)printf("Yes\n");
- continue;
- }
- int fl=BFS();
- if(fl)printf("Yes\n");
- else printf("No\n");
- }
- fclose(stdin);fclose(stdout);
- return ;
- }
20分 暴力
- /*
- 考试的时候忘记判断起点和终点是否合法了
- */
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- using namespace std;
- int n,m,x1,x2,y1,y2,e[][]={{,},{,}};
- char map[][];
- bool vis[];
- int f(int x,int y){
- return (x-)*m+y;
- }
- bool BFS(){
- queue<int>q;
- memset(vis,,sizeof(vis));
- vis[f(x1,y1)]=;
- q.push(f(x1,y1));
- while(!q.empty()){
- int now=q.front();q.pop();
- int x=(now-)/m+,y=now-(x-)*m;
- for(int i=;i<;i++){
- int xx=x+e[i][],yy=y+e[i][];
- int w=f(xx,yy);
- if(xx>=&&xx<=n&&yy>=&&yy<=n&&xx<=x2&&yy<=y2&&!vis[w]&&map[xx][yy]=='.'){
- if(xx==x2&&yy==y2)return ;
- vis[w]=;
- q.push(w);
- }
- }
- }
- return ;
- }
- int main(){
- //freopen("Cola.txt","r",stdin);
- freopen("boardgame.in","r",stdin);freopen("boardgame.out","w",stdout);
- scanf("%d%d",&n,&m);
- for(int i=;i<=n;i++)scanf("%s",map[i]+);
- int q;
- scanf("%d",&q);
- while(q--){
- scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
- if(x2<x1||y2<y1){
- printf("No\n");
- continue;
- }
- if(x1==x2){
- bool flag=;
- for(int i=y1;i<=y2;i++){
- if(map[x1][i]=='#'){
- flag=;
- printf("No\n");break;
- }
- }
- if(!flag)printf("Yes\n");
- continue;
- }
- if(y1==y2){
- bool flag=;
- for(int i=x1;i<=x2;i++){
- if(map[i][y1]=='#'){
- flag=;
- printf("No\n");break;
- }
- }
- if(!flag)printf("Yes\n");
- continue;
- }
- if(map[x1][y1]=='#'){
- printf("No\n");
- continue;
- }
- int fl=BFS();
- if(fl)printf("Yes\n");
- else printf("No\n");
- }
- fclose(stdin);fclose(stdout);
- return ;
- }
40分 暴力
2017-10-6 清北刷题冲刺班p.m的更多相关文章
- 2017-10-4 清北刷题冲刺班p.m
P102zhx a [问题描述]你是能看到第一题的 friends 呢.——hja两种操作:1.加入一个数.2.询问有多少个数是?的倍数.[输入格式]第一行一个整数?,代表操作数量.接下来?行,每行两 ...
- 2017-10-4 清北刷题冲刺班a.m
P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...
- 2017-10-3 清北刷题冲刺班p.m
a [问题描述]你是能看到第一题的 friends 呢.——hja给你一个只有小括号和中括号和大括号的括号序列,问该序列是否合法.[输入格式]一行一个括号序列.[输出格式]如果合法,输出 OK,否则输 ...
- 2017-10-3 清北刷题冲刺班a.m
P99zhx a [问题描述]你是能看到第一题的 friends 呢.——hja怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两 ...
- 2017-10-2 清北刷题冲刺班a.m
一道图论神题 (god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只 ...
- 2017-10-2 清北刷题冲刺班p.m
最大值 (max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n ...
- 2017-10-1 清北刷题冲刺班p.m
一道图论好题 (graph) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...
- 2017-10-7 清北刷题冲刺班p.m
测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...
- 2017-10-7 清北刷题冲刺班a.m
测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...
- 2017-10-1 清北刷题冲刺班a.m
位运算1 (bit) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥 ...
随机推荐
- node cluster模块的使用和测试
首先安装async包 用到的有http.cluster包 http和cluster都会node自带的包,无需安装 1:创建cluster.js,代码如下,更具cpu创建多个进程 var cluster ...
- appium-环境搭建(一)
adb命令 adb的全称为Android Debug Bridge,就是起到调试桥的作用.借助adb工具,我们可以管理设备或者手机模拟器的状态.还可以进行很多手机操作,如安装软件\系统升级\运行she ...
- HashMap,Hashtable,TreeMap ,Map
package com.wzy.list; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterato ...
- IO - 同步,异步,阻塞,非阻塞 (转帖:http://blog.csdn.net/historyasamirror/article/details/5778378)
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...
- nodejs stream & buffer 互相转换
stream 转 buffer function streamToBuffer(stream) { return new Promise((resolve, reject) => { let b ...
- rust ownership 系统
### 对象销毁规则 未被使用的函数返回值 被let绑定的值, 在函数末尾销毁,除非被moved ``` let v = obj::new("a"); other_fun(v); ...
- hdu-5867 Water problem(水题)
题目链接: Water problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- hdu5606 tree (并查集)
tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- linux命令学习笔记(48):watch命令
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测 一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下 ...
- freeMarker(六)——程序开发指南入门
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.创建Configuration实例 首先,你应该创建一个 free ...