题意:有一棵树,Alice和Bob两个人要从树根走到叶子。Alice想要路径尽量短,Bob想要路径尽量长,且路径长度一定要在[L,R]区间范围内。从根节点开始Bob和Alice轮流选择走那条路,问Bob能选到的最长路径是什么?
解法:这道题一看到就想Bob从儿子中选最长的,Alice从儿子中选最短的就可以了,码了之后就过了。。。但是之后想想觉得有点不对劲,因为Bob想要尽量长,要是他这回合选了最长的儿子,那么下一回合就是Alice选了,那么Alice会不会选一条对Bob不利的路,使得其实Bob在上一回合选一条次长的而不是最长的反而会更划算。(如果按照这个思路想的话,那Bob就应该从儿子中选一个最短的最长来避免最保证最坏情况的发生)。关于这个疑问蒟蒻博主还现在没想明白。
另外,这道题对时间要求极高,博主需要用到输入挂才顺利通过。
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<algorithm> using namespace std; const int N=5e5+10; const int INF=0x3f3f3f3f; int n,l,r,indeg[N]; //inline int read() { // int x=0, f=1; register char ch=getchar(); // for (; ch<'0' || ch>'9'; ch=getchar()) if (ch=='-') f=-1; // for (; ch>='0' && ch<='9'; ch=getchar()) x=x*10+ch-'0'; // return x*f; //} #define reg register #define fok (ch!=EOF) #define sep (ch==' '||ch==' '||ch==' ') #define dsep !isdigit(ch) #define neq(a,b) ((a)-(b)>1e-6) struct FastIO{ char rbuf[1000002],wbuf[1000002],b,*p1,*p2; int rs,ws,S; FastIO(){p1=rbuf,p2=wbuf,S=1000000,rs=1000000,ws=-1,b=1;} inline void go(){fwrite(wbuf,1,ws+1,stdout)?ws=-1:0;} inline char getch(){ return rs==S&& (p1=rbuf,rs=-1,(S=fread(rbuf,1,S+1,stdin)-1)==-1)? (b=0,EOF):(++rs,*p1++); } inline void putch(int x){ ws==1000000&& (p2=wbuf,ws=-1,fwrite(wbuf,1,1000001,stdout)),++ws,*p2++=x; } inline void puts(char str[]){ for(reg int i=0;str[i]!='