8.10的暂且咕掉叭。。。。
终于开始向物理竞赛方向扩展了吗!#@%……¥%
很氵的模拟,开个栈走一遍就行了。
#include
using namespace std;
#define mp make_pair
int n,len;
double dz[310];
int pos[310],vis[310],cnt;
double ans;
string dl;
map a;
stack > sta;
int Read(){
int i=0,f=1;
char c=getchar();
for(;(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
int main(){
n=Read();
for(int i=1;i<=n;++i){
double x;
scanf("%lf",&x);
string s="R"+('0'+i);
a[s]=x;
}
cin>>dl;
len=dl.size();
for(int i=0;i
此时一位不会ST表的蔡鸡路过(你好蔡啊
线段树qnlogm被卡出shi来。。。。
定义 f[i][j][k]表示以(i,j)为左上角,大小为 2^k 的正方形
方阵的最大(最小)值是多少。
维护类似 RMQ。
可以发现,对于每个询问,最多 8 个正方形即可覆盖。
所以时间复杂度 O(n*m*log(n)+q)
#include
using namespace std;
const int MAXN=810;
const int INF=0x3f3f3f3f;
int n,m;
int a[MAXN][MAXN];
int q,x,l,y,r,z[10];
int sum[MAXN][MAXN],ans;
int f[MAXN][MAXN][10],g[MAXN][MAXN][10],len,lo;
char ops;
int Read(){
int i=0,f=1;
char c=getchar();
for(;(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
int main(){
n=Read(),m=Read();
z[0]=1;
for(int i=1;i<10;i++)
z[i]=z[i-1]<<1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=Read();
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
f[i][j][0]=g[i][j][0]=a[i][j];
}
}
for(int k=1;k<10;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j][k]=max(max(f[i][j][k-1],f[min(n,i+z[k-1])][j][k-1]),
max(f[i][min(m,j+z[k-1])][k-1],f[min(n,i+z[k-1])][min(m,j+z[k-1])][k-1])),
g[i][j][k]=min(min(g[i][j][k-1],g[min(n,i+z[k-1])][j][k-1]),
min(g[i][min(m,j+z[k-1])][k-1],g[min(n,i+z[k-1])][min(m,j+z[k-1])][k-1]));
}
}
}
q=Read();
while(q--){
char cz[5];
scanf("%sum",cz);
int x=Read()+1,y=Read()+1,l=Read()+1,r=Read()+1;
if(cz[0]=='S')ans=sum[l][r]-sum[l][y-1]-sum[x-1][r]+sum[x-1][y-1];
else{
len=min(l-x+1,r-y+1);
// cout<len;lo--);
// cout<l)i=l-z[lo]+1;
for(int j=y;j!=r+1;j=j+z[lo]){
if(j+z[lo]-1>r)j=r-z[lo]+1;
ans=max(ans,f[i][j][lo]);
}
}
}
else {
ans=INF;
for(int i=x;i!=l+1;i=i+z[lo]){
if(i+z[lo]-1>l)i=l-z[lo]+1;
for(int j=y;j!=r+1;j=j+z[lo]){
if(j+z[lo]-1>r)j=r-z[lo]+1;
ans=min(ans,g[i][j][lo]);
}
}
}
}
cout<
论暴力是如何打挂的。。。。。。
我们仍未知道那天打挂的暴力是哪出了问题。。。。
转树都考虑到了但没想到如何统计(我好蔡啊
转树形DP就好了QAQ
#include
using namespace std;
typedef long long LL;
const LL MAXN=2e5+10;
LL T;
LL n,m,p,cnt,flag;
LL inv[MAXN],fac[MAXN];
LL head[MAXN],vis[MAXN],in[MAXN],siz[MAXN],dp[MAXN];
LL nxt[MAXN<<1],to[MAXN<<1];
LL Read(){
LL i=0,f=1;
char c=getchar();
for(;(c>'9'||c<'0')&&c!='-';c=getchar());
if(c=='-') f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())
i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
void add(LL x,LL y){
++cnt;
nxt[cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
}
LL calc(LL x,LL y){
return fac[x]*inv[y]%p*inv[x-y]%p;
}
void dfs(LL u,LL fa){
vis[u]=1;
for(LL i=head[u];i!=-1;i=nxt[i]){
LL v=to[i];
if(vis[v]){
flag=1;
return ;
}
if(v==fa) continue;
dfs(v,u);
if(flag) return ;
}
}
void dfs1(LL u,LL fa){
dp[u]=1;
siz[u]=0;
for(LL i=head[u];i!=-1;i=nxt[i]){
LL v=to[i];
if(v==fa) continue;
dfs1(v,u);
siz[u]+=siz[v];
dp[u]=(dp[u]*calc(siz[u],siz[v])%p*dp[v])%p;
}
++siz[u];
}
LL ksm(LL a,LL b){
LL ret=1;
while(b){
if(b&1) ret=ret*a%p;
b>>=1;
a=a*a%p;
}
return ret;
}
void init(){
memset(head,-1,sizeof(head));
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
flag=0,cnt=0;
}
int main(){
T=Read();
while(T--){
init();
n=Read(),m=Read(),p=Read();
fac[0]=inv[0]=1;
for(LL i=1;i<=n+1;++i) fac[i]=fac[i-1]*i%p;
inv[n+1]=ksm(fac[n+1],p-2);
for(LL i=n;i>=1;--i) inv[i]=inv[i+1]*(i+1)%p;
for(LL i=1;i<=m;++i){
LL x=Read(),y=Read();
add(y,x),in[x]++;
}
for(LL i=1;i<=n;++i){
if(!in[i]) add(0,i);
}
for(LL i=0;i<=n;++i) if(!vis[i]) dfs(i,-1);
if(flag){puts("0");continue;}
dfs1(0,-1);
cout<