题目来自神犇chad
上次爆零是说着玩,这次真的爆零了QAQ
好吧貌似是TYVJ的模拟赛打多了..一直按照TYVJ的格式提交的压缩包..
然后莫名其妙就AK了hhh
来的时候迟到了半小时,昨晚痛苦的补作业补到了1点..,晚上补作业留下的泪就是白天浪时脑子里进的水
所以刚来的时候脑子有点昏,所以T1又是喜闻乐见的不会..
然后按照以往的套路滚去看T2
慢着...这道题好像有些眼熟?这不是我之前放在OJ上的一道题嘛 skip!
去看了看T3,Tarjan+分层图。可以,这很图论,水了一发模板
//chad round T3 //by Cydiater //2016.9.16 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctime> #include <cmath> #include <iostream> #include <cstdlib> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) typedef pair<int,int> pii; #define FILE "trip" ; const int oo=0x3f3f3f3f; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ,LEN=,Link[MAXN],group[MAXN],group_num=,dfn[MAXN],low[MAXN],dfs_clock=,stack[MAXN],top=,Node[MAXN][],cnt=,dis[MAXN],ans=; priority_queue<pii, vector<pii>, greater<pii> >q; bool vis[MAXN]; struct edge{ int x,y,next,v; }e[MAXN],E[MAXN<<]; namespace solution{ inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;e[len].x=x;} inline void Insert(int x,int y,int v){E[++LEN].next=Link[x];Link[x]=LEN;E[LEN].y=y;E[LEN].v=v;E[LEN].x=x;} void init(){ N=read();M=read();K=read(); up(i,,M){ int x=read(),y=read(),v=read(); insert(x,y,v); } } void tarjan(int node){ vis[node]=;dfn[node]=low[node]=++dfs_clock; stack[++top]=node; for(int i=LINK[node];i;i=e[i].next) if(!dfn[e[i].y]){ tarjan(e[i].y); low[node]=min(low[node],low[e[i].y]); }else if(vis[e[i].y]) low[node]=min(low[node],dfn[e[i].y]); if(dfn[node]==low[node]){ group_num++; int tmp; do{ tmp=stack[top--]; vis[tmp]=; group[tmp]=group_num; }while(tmp!=node); } } void dijkstra(){ memset(dis,,sizeof(dis)); memset(vis,,sizeof(vis)); dis[Node[group[]][]]=;q.push(make_pair(dis[Node[group[]][]],Node[group[]][])); while(!q.empty()){ pii tmp=q.top();q.pop(); int dist=tmp.first,node=tmp.second; if(vis[node])continue; vis[node]=; for(int i=Link[node];i;i=E[i].next) if(dis[E[i].y]>dis[node]+E[i].v){ dis[E[i].y]=dis[node]+E[i].v; q.push(make_pair(dis[E[i].y],E[i].y)); } } } void slove(){ memset(vis,,sizeof(vis)); memset(dfn,,sizeof(dfn)); memset(low,,sizeof(low)); up(i,,N)if(!dfn[i])tarjan(i); up(i,,N)up(k,,K)Node[i][k]=++cnt; up(i,,len){ int x=e[i].x,y=e[i].y,v=e[i].v; if(group[x]==group[y])continue; up(k,,K) Insert(Node[group[x]][k],Node[group[y]][k],v); up(k,,K-) Insert(Node[group[x]][k],Node[group[y]][k+],); } dijkstra(); } void output(){ up(k,,K)ans=min(ans,dis[Node[group[N]][k]]); )ans=-; cout<<ans<<endl; } } int main(){ //freopen("input.in","r",stdin); freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); using namespace solution; init(); slove(); output(); ; }
这些模板敲过好几遍了,不拍了。去看T1!
$ans \leq 50$
好呀,搞个二维前缀和枚举
//chad round T1 //by Cydiater //2016.9.16 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <iomanip> #include <ctime> #include <cmath> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define FILE "papercut" ; const int oo=0x3f3f3f3f; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } int N,M,K,cnt[MAXN][MAXN]; namespace solution{ void init(){ N=read();M=read();K=read(); memset(cnt,,sizeof(cnt)); up(i,,K){ int x=read(),y=read(); cnt[x][y]=; } up(i,,N)up(j,,M)cnt[i][j]=cnt[i-][j]+cnt[i][j-]-cnt[i-][j-]+cnt[i][j]; } void slove(){ down(ans,min(min(N,M),),){ up(i,ans,N)up(j,ans,M){ int tmp1=cnt[i][j],tmp2=cnt[i][j-ans]+cnt[i-ans][j]-cnt[i-ans][j-ans]; ){ printf("%d\n",ans); return; } } } puts("); } } int main(){ //freopen("input.in","r",stdin); freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); using namespace solution; init(); slove(); ; }
然后水了水T2的模板
//chad round T2 //by Cydiater //2016.9.16 #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <iomanip> #include <cstdlib> #include <ctime> #include <cmath> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define FILE "string" ; const int oo=0x3f3f3f3f; inline int read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } char s[MAXN]; ,ans=; namespace solution{ inline bool equ(int x,int y,int l){return rank[x]==rank[y]&&rank[x+l]==rank[y+l];} void init(){ scanf(); N=strlen(s+); } void suffix_sort(){ up(i,,N){rank[i]=s[i];sa[i]=i;} ,i,sig=,pos=;pos<N;sig=pos){ ,i=N-l+;i<=N;i++)p[++pos]=i; ;i<=N;i++)if(sa[i]>l)p[++pos]=sa[i]-l; ;i<=sig;i++)cnt[i]=; ;i<=N;i++)cnt[rank[i]]++; ;i<=sig;i++)cnt[i]+=cnt[i-]; for(i=N;i;i--)sa[cnt[rank[p[i]]]--]=p[i]; ,i=;i<=N;i++)tmp[sa[i]]=equ(sa[i],sa[i-],l)?pos:++pos; ;i<=N;i++)rank[i]=tmp[i]; l=l==?:l<<; } } void get_height(){ ,j=,k;i<=N;i++){ ])){j=;continue;} if(j)j--; while(s[i+j]==s[k+j])j++; height[rank[i]]=j; } } void slove(){ suffix_sort(); get_height(); up(i,,N)ans+=N-sa[i]+-height[i]; } void output(){ cout<<ans<<endl; } } int main(){ //freopen("input.in","r",stdin); freopen(FILE".in","r",stdin); freopen(FILE".out","w",stdout); using namespace solution; init(); slove(); output(); ; }
小结
除了T2出后缀数组比较坑,其他的题都很不错。其实NOIp通用的知识点就那么几个,关键还是看考试的状态。连着这几场考试都没有数论,很有可能是一个flag..
陷入LCT的坑无法自拔感觉各种基础算法都忘光了