今天上午考得不是很好,主要还是自己太弱QAQ

开场第一题给的图和题意不符,搞了半天才知道原来是走日字形的

然后BFS即可

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
using namespace std; const int maxn=110;
int n,m,a,b,c,d;
int vis[maxn][maxn];
struct pos{
int x,y;
pos(int x=0,int y=0):x(x),y(y){}
};
queue<pos>Q;
int fx[8]={2,2,1,1,-1,-1,-2,-2};
int fy[8]={1,-1,2,-2,2,-2,1,-1}; int BFS(){
if(a==c&&b==d)return 0;
while(!Q.empty())Q.pop();
vis[a][b]=0;Q.push(pos(a,b));
while(!Q.empty()){
pos tmp=Q.front();Q.pop();
for(int i=0;i<8;++i){
int xx=fx[i]+tmp.x,yy=fy[i]+tmp.y;
if(xx<1||yy<1||xx>n||yy>m)continue;
if(vis[xx][yy]!=-1)continue;
if(xx==c&&yy==d)return vis[tmp.x][tmp.y]+1;
vis[xx][yy]=vis[tmp.x][tmp.y]+1;
Q.push(pos(xx,yy));
}
}return -1;
} int main(){
while(scanf("%d%d%d%d%d%d",&n,&m,&a,&b,&c,&d)==6){
memset(vis,-1,sizeof(vis));
int k=BFS();
if(k==-1)printf("impossible\n");
else printf("%d\n",k);
}return 0;
}

第二题给定一个无向图,询问有多少个环不属于任意一个简单环,有多少个环属于至少两个简单环

考试快结束才有点思路,然后码了一发边双一直在挂,最后也没有做出来

考试结束后听lyc说是点双,仔细分析了一下确实是,考试的时候太心急了

改成点双就A了

思路就很显然:点双中如果边数>点数,那么所有点至少属于两个简单环

如果边数<点数,那么不属于任意一个简单环

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
const int maxn=100010;
int n,m;
int h[maxn],cnt=0;
struct edge{
int to,next;
}G[maxn<<1];
int u,v;
int ans1,ans2;
int pre[maxn],low[maxn];
int vis[maxn],tim;
int dfs_clock,bcc_cnt;
vector<int>V;
stack<int>S; void add(int x,int y){
++cnt;G[cnt].to=y;G[cnt].next=h[x];h[x]=cnt;
}
void Get_ans(){
int sz=V.size(),cnt=0;
for(int i=0;i<sz;++i){
int u=V[i];
for(int j=h[u];j;j=G[j].next){
int v=G[j].to;
if(vis[v]==tim)cnt++;
}
}
cnt>>=1;
if(cnt>sz)ans2+=cnt;
else if(cnt<sz)ans1+=cnt;
} void DFS(int u,int fa){
low[u]=pre[u]=++dfs_clock;
S.push(u);
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(!pre[v]){
DFS(v,u);low[u]=min(low[v],low[u]);
if(low[v]>=pre[u]){
V.clear();tim++;
for(;;){
int now=S.top();S.pop();
vis[now]=tim;V.push_back(now);
if(now==v)break;
}V.push_back(u);vis[u]=tim;
Get_ans();
}
}
else if(fa!=v)low[u]=min(low[u],pre[v]);
}return;
}
void Solve(){
ans1=ans2=0;
memset(pre,0,sizeof(pre));
memset(low,0,sizeof(low));
dfs_clock=bcc_cnt=0;
for(int i=1;i<=n;++i)if(!pre[i])DFS(i,-1);
printf("%d %d\n",ans1,ans2);
}
int main(){
while (scanf("%d%d",&n,&m)==2){
if(!n&&!m)break;
memset(h,0,sizeof(h));cnt=1;
for (int i=1;i<=m;++i){
scanf("%d%d",&u,&v);
u++;v++;
add(u,v);add(v,u);
}Solve();
}
return 0;
}

第三题给定一棵树,询问树上的路径中是否有长度等于k的

直接裸上树分治就可以啦,不到15min码完,1A

用哈希表可以做到O(nlogn)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std; const int maxn=10010;
const int mod=521;
int n,u,v;
int h[maxn],cnt=0;
struct edge{
int to,next,w;
}G[maxn<<1];
int Q[maxn],k;
bool check[maxn],vis[maxn];
int f[maxn],w[maxn],sum,g;
int st[maxn],top;
int dis[maxn];
int a[maxn];
struct HASHMAP{
int h[mod+10],cnt;
int nxt[maxn<<1],st[maxn];
void init(){memset(h,0,sizeof(h));cnt=0;}
int ask(int k){
int key=k%mod;
for(int i=h[key];i;i=nxt[i]){
if(st[i]==k)return true;
}return false;
}
void push(int k){
int key=k%mod;
for(int i=h[key];i;i=nxt[i]){
if(st[i]==k)return;
}
++cnt;nxt[cnt]=h[key];h[key]=cnt;
st[cnt]=k;return;
}
}H;
void add(int x,int y,int z){
cnt++;G[cnt].to=y;G[cnt].next=h[x];G[cnt].w=z;h[x]=cnt;
}
void read(int &num){
num=0;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
}
void cmax(int &a,int b){if(b>a)a=b;}
void Get_G(int u,int fa){
f[u]=0;w[u]=1;
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(vis[v]||v==fa)continue;
Get_G(v,u);w[u]+=w[v];
cmax(f[u],w[v]);
}cmax(f[u],sum-w[u]);
if(f[u]<f[g])g=u;
}
void Get_dis(int u,int f){
st[++top]=dis[u];
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(vis[v]||v==f)continue;
dis[v]=dis[u]+G[i].w;
Get_dis(v,u);
}return;
}
void Get_div(int u){
vis[u]=true;H.init();H.push(0);
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(vis[v])continue;
top=0;dis[v]=G[i].w;Get_dis(v,-1);
for(int j=1;j<=top;++j){
for(int now=1;now<=k;++now){
if(st[j]<=a[now])check[now]|=H.ask(a[now]-st[j]);
}
}
for(int j=1;j<=top;++j)H.push(st[j]);
}
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(vis[v])continue;
g=0;sum=w[v];Get_G(v,-1);
Get_div(g);
}return;
} int main(){
while(scanf("%d",&n)==1){
if(!n)break;
memset(h,0,sizeof(h));cnt=0;
for(int i=1;i<=n;++i){
while(scanf("%d",&u)==1){
if(!u)break;
scanf("%d",&v);
add(i,u,v);add(u,i,v);
}
}k=1;
while(scanf("%d",&a[k])==1){
if(!a[k])break;
k++;
}k--;
memset(vis,false,sizeof(vis));
memset(check,false,sizeof(check));
f[0]=0x7fffffff;sum=n;g=0;
Get_G(1,-1);Get_div(g);
for(int i=1;i<=k;++i){
if(check[i])printf("AYE\n");
else printf("NAY\n");
}printf(".\n");
}return 0;
}

第四题给定一个矩阵,询问最大子矩形

直接悬线法裸上就可以了,一开始为了秀技术写单调栈,一直WA

改成悬线法就过了,后来发现自己单调栈有个地方没有+1 QAQ

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int maxn=1010; char s[maxn][maxn];
int map[maxn][maxn];
int n,m;
int T,ans,kase;
int h[maxn],l[maxn],r[maxn]; int Get_ans(int type){
int ans=0;
int L,R;
for(int j=1;j<=m;j++){h[j]=0;l[j]=1;r[j]=m;}
for(int i=1;i<=n;i++){
L=0;R=m+1;
for(int j=1;j<=m;j++){
if(map[i][j]==type){h[j]=0;l[j]=1;L=j;}
else{h[j]++;l[j]=max(l[j],L+1);}
}
for(int j=m;j>=1;j--){
if(map[i][j]==type){r[j]=m;R=j;}
else{r[j]=min(r[j],R-1);ans=max(ans,(h[j]+(r[j]-l[j]+1))*2);}
}
}return ans;
} int main(){
scanf("%d",&T);
while (T--){
ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%s",s[i]+1);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s[i][j]=='B')map[i][j]=0;
if(s[i][j]=='R')map[i][j]=1;
}
}
ans=max(ans,Get_ans(1));
ans=max(ans,Get_ans(0));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if((i+j-1)&1)map[i][j]^=1;
}
}
ans=max(ans,Get_ans(1));
ans=max(ans,Get_ans(0));
printf("Case #%d: %d\n",++kase,ans);
}return 0;
}

第五题暂时还没有弄懂

第六题是UVa某题的变形,结果发现自己并不会变形之后的问题

首先很重要的一件事情是蚂蚁的相对位置不会改变

我们不妨把让转换参考系,让向左走的蚂蚁每次走2m/S,向右走的蚂蚁不动

这样很容易就可以计算出向左走的蚂蚁的贡献,向右走的蚂蚁由于颜色一直不动,贡献也是易于计算的

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std; typedef long long LL;
const int maxn=100010;
int n,k,d[maxn],b[maxn],sum[maxn],tmp[maxn];
int now;
bool vis[maxn];
LL ans[maxn];
char s[10]; int main(){
scanf("%d%d",&n,&k);
scanf("%d",&d[n+1]);
for(int i=1;i<=n;++i){
scanf("%d%d%s",&d[i],&b[i],s);
vis[i]=(s[0]=='L');
if(!vis[i])ans[b[i]]+=(d[n+1]-d[i])<<1;
}
for(int i=n;i>=0;--i){
for(int j=0;j<k;++j)ans[j]+=sum[j]*(d[i+1]-d[i]);
if(!vis[i]){
for(int j=0;j<k;++j)tmp[(j+b[i])%k]=sum[j];
for(int j=0;j<k;++j)sum[j]=tmp[j];
}else sum[b[i]]++;
}
for(int i=1;i<=n;++i){
if(vis[i])ans[(now+b[i])%k]+=d[i];
else now=(now+b[i])%k;
}
for(int i=0;i<k;++i){
printf("%lld.",ans[i]>>1);
if(ans[i]&1)printf("5\n");
else printf("0\n");
}return 0;
}

上午只做出了1、3、4,

其中第一题是BFS题目,第三题是树分治的模板题,第四题是悬线法的模板题

第二题太心急了,仔细想想如果发现是点双就可以A了

第五题和第六题是真没看出来

感觉上午发挥的很糟糕,主要是心态问题

PKUSC 模拟赛 day2 上午总结的更多相关文章

  1. PKUSC 模拟赛 day2 下午总结

    终于考完了,下午身体状况很不好,看来要锻炼身体了,不然以后ACM没准比赛到一半我就挂掉了 下午差点AK,有一道很简单的题我看错题面了所以没有A掉 第一题显然是非常丝薄的题目 我们很容易通过DP来O(n ...

  2. PKUSC 模拟赛 day1 上午总结

    思考了一下第二题,觉得有无数种乱搞做法 类似什么bitset压位,MCS染色之类奇怪的做法 然而都是玄学正确性或者玄学复杂度 先放题解把 第一题显然具有单调性,二分就可以啦 O(nlogn),貌似输出 ...

  3. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  4. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

  5. CH Round #55 - Streaming #6 (NOIP模拟赛day2)

    A.九九归一 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2355%20-%20Streaming%20%236%20(NOIP模拟赛day2)/九九归一 题 ...

  6. PKUSC 模拟赛 题解_UPD

    之前挖了两个大坑 一个是day1下午的第二题 另一个是day2上午的第五题 先说day1下午的第二题吧 我们显然不能O(n^2)的dp,所以我们只能算贡献 首先对于任意一个边界点而言,他对答案的贡献路 ...

  7. PKUSC 模拟赛 day1 下午总结

    下午到了机房之后又困又饿,还要被强行摁着看英文题,简直差评 第一题是NOIP模拟赛的原题,随便模拟就好啦 本人模拟功力太渣不小心打错了个变量,居然调了40多分钟QAQ #include<cstd ...

  8. CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告

    T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7 ...

  9. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

随机推荐

  1. 我们为什么要使用 href="javascript:void(0)"

    做过web前端UI的小伙伴们都知道,有时候我们在网页中会使用一些超级链接,而这些链接不用指向任何地址,只是为了配合javascript的onclick事件而存在的,当我们点击这些链接时(其实也可以看做 ...

  2. Git命令收集【不断更新中】

    git stash 可以用来保存暂时不想提交但又被修改过的文件. git stash pop 用来取出被保存在stash栈中的修改过的所有文件. git stash show 查询哪些文件被存放在了s ...

  3. 另辟思路解决 Android 4.0.4 不能监听Home键的问题

    问题描述: 自从Android 4.0以后,开发人员是不能监听和屏蔽Home键的,对于KEYCODE_HOME,官方给出的描述如下: Home key. This key is handled by ...

  4. jQuery 滑动方法slideDown向下滑动元素

    通过 jQuery可以在元素上创建滑动效果,jQuery slideDown() 方法用于向下滑动元素. jQuery 滑动方法 通过 jQuery,您可以在元素上创建滑动效果. jQuery 拥有以 ...

  5. Messages.pas里的消息

    一.Windows 消息大全 这张表拷贝自万一兄的帖子:http://www.cnblogs.com/del/archive/2008/02/25/1079970.html 但是我希望自己能把这些消息 ...

  6. getchar(),gets(),scanf()的差异比较

    scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用gets()函数. gets可以接收空格:而sc ...

  7. CentOS6.3连网获取IP失败 This device is not active

    虚拟机拷贝到其它机器之后,启动:然后用ifconfig -a发现eth0没有IP地址,查看 /etc/sysconfig/network-scripts/ifcfg-eth0文件,发现IP地址已经指定 ...

  8. C#——中文转化成拼音

    在KS系统中用到了中文转化成拼音的功能.通过查阅资料为下面是代码. /// <summary> /// MyConvert 的摘要说明 /// </summary> publi ...

  9. matlab实现雅可比、高斯塞德尔、后项误差计算

    稀疏矩阵生成: function [a, b] = aparsesetup(n) e = ones(n, 1); n2 = n / 2; a = spdiags([-e 3*e -e], -1:1, ...

  10. learning from the previous teams

    开发人员水平有限.分配任务的时候经常有说这个事儿做不到,或者压根不知道怎么做:验收工作频出意外,DEV写了一个模块之后,验收的时候发现模块质量不行,代码质量低是其次,无法按照给定的接口工作.设计不足. ...