2021.12.16 eleveni的刷题记录
2021.12.16 eleveni的刷题记录
1. 数论
https://www.luogu.com.cn/problem/P2532
1.1卡特兰数
https://www.luogu.com.cn/blog/syksykCCC/solution-p2532
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=1e4+10;
int n;
struct node{
int len,num[N];
node(){
memset(num,0,sizeof(num));
len=1;num[1]=1;
}
node operator *(const int &k)const{
node fin;
for(int i=1;i<=len;i++)fin.num[i]=num[i]*k;
fin.len=len;
for(int i=2;i<=fin.len;i++){
fin.num[i]+=fin.num[i-1]/10;
fin.num[i-1]%=10;
}
while(fin.num[fin.len]>10){
fin.num[fin.len+1]+=fin.num[fin.len]/10;
fin.num[fin.len]%=10;
++fin.len;
}
return fin;
}
node operator /(const int &k)const{
node fin;
int t=0;
for(int i=len;i>=1;i--){
t=t*10+num[i];
fin.num[i]=t/k;
t=t%k;
}
fin.len=len;
while(!fin.num[fin.len])--fin.len;
return fin;
}
}ans;
int main(){
IOS;
cin>>n;
for(int i=n+2;i<=2*n;i++)ans=ans*i;
for(int i=2;i<=n;i++)ans=ans/i;
for(int i=ans.len;i>=1;i--)cout<<ans.num[i];
return 0;
}
1.2 同余
https://www.luogu.com.cn/problem/P4296
set的应用!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
ll n;
set<ll>s;
int main(){
cin>>n;
ll m=sqrt(n);
if(n==1)return puts("None"),0;
s.insert(1);
for(ll i=1;i<=m;i++)if(n%i==0){
ll j=n/i;
for(ll k=j+1;k<=n;k+=j)if((k+1)%i==0)s.insert(k);
for(ll k=j-1;k<=n;k+=j)if((k-1)%i==0)s.insert(k);
}
if(!s.size())return puts("None"),0;
for(set<ll>::iterator it=s.begin();it!=s.end();it++)cout<<*it<<endl;
return 0;
}
1.3 矩阵
https://www.luogu.com.cn/problem/P3873
矩阵快速幂:一直不变的那个矩阵是basic
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=110;
const int mod=4147;
int n,m;
struct Matrix{
int num[N][N];
Matrix(){
memset(num,0,sizeof(num));
}
Matrix operator *(const Matrix &b)const{
Matrix c;
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++)
for(int k=1;k<=100;k++)
c.num[i][j]=(c.num[i][j]+num[i][k]*b.num[k][j])%mod;
return c;
}
}ans,basic;
inline Matrix operator ^(Matrix x,int y){
Matrix fin=x;--y;
while(y){
if(y&1)fin=fin*x;
x=x*x;
y>>=1;
}
return fin;
}
int main(){
IOS;
cin>>n>>m;
for(int i=n;i>=1;i--)cin>>ans.num[i][1];
for(int i=n;i>=1;i--)cin>>basic.num[n][i];
for(int i=2;i<=n;i++)basic.num[i-1][i]=1;
/*cout<<"ans "<<endl;
for(int i=1;i<=n;i++)cout<<ans.num[i][1]<<endl;
cout<<"basic "<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)cout<<basic.num[i][j]<<" ";
cout<<endl;
}
cout<<endl;*/
m-=n;
basic=basic^m;
ans=basic*ans;
//cout<<"change ans"<<endl;
//for(int i=1;i<=n;i++)cout<<ans.num[i][1]<<endl;
cout<<ans.num[n][1];
return 0;
}
2. 动态规划
动态规划是算好了拿来直接用?/疑惑
2.1 普通DP
https://www.luogu.com.cn/problem/P2530
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=11;
const int inf=0x3f3f3f3f;
int n,f[N*N][N][N][N];
char a[N*N];
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
memset(f,inf,sizeof(f));
f[0][0][0][0]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=10;j++)
for(int k=0;k<=10-j;k++)
for(int l=0;l<=10-j-k;l++){
if(+k+l>10)continue;
if(a[i]=='A'&&j)f[i][j][k][l]=f[i-1][j-1][k][l];
if(a[i]=='B'&&k)f[i][j][k][l]=f[i-1][j][k-1][l];
if(a[i]=='C'&&l)f[i][j][k][l]=f[i-1][j][k][l-1];
f[i][0][k][l]=min(f[i][0][k][l],f[i][j][k][l]+1);
f[i][j][0][l]=min(f[i][j][0][l],f[i][j][k][l]+1);
f[i][j][k][0]=min(f[i][j][k][0],f[i][j][k][l]+1);
}
cout<<f[n][0][0][0];
return 0;
}
https://www.luogu.com.cn/problem/P4398
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=55;
int n,a[N][N],b[N][N],f[N][N][N][N];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int main(){
n=read();
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)a[i][j]=read();
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)b[i][j]=read();
int ans=0;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)for(int l=1;l<=n;l++){
if(a[i][j]==b[k][l])
f[i][j][k][l]=min(f[i-1][j-1][k-1][l-1],min(f[i][j-1][k][l-1],f[i-1][j][k-1][l]))+1;
ans=max(ans,f[i][j][k][l]);
}
cout<<ans;
return 0;
}
https://www.luogu.com.cn/problem/P2592
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int mod=12345678;
int n,m,k,f[155][155][25][25];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int main(){
n=read();m=read();k=read();
f[0][0][0][0]=1;
for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)
for(int u=0;u<=k;u++)for(int v=0;v<=k;v++){
int x=f[i][j][u][v];
f[i+1][j][max(u-1,0)][v+1]=(f[i+1][j][max(u-1,0)][v+1]+x)%mod;
f[i][j+1][u+1][max(v-1,0)]=(f[i][j+1][u+1][max(v-1,0)]+x)%mod;
}
int ans=0;
for(int i=0;i<=k;i++)for(int j=0;j<=k;j++)
ans=(ans+f[n][m][i][j])%mod;
cout<<ans;
return 0;
}
2.2 树形DP
https://www.luogu.com.cn/problem/P3698
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=110;
int n,m,cnt,head[N],f[2][N][N],fa[N];
struct node{
int to,next;
}a[N*2];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
inline void add(int u,int v){
++cnt;
a[cnt].to=v;
a[cnt].next=head[u];
head[u]=cnt;
}
inline void pre(int x,int fai){
fa[x]=fai;
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
if(v==fai)continue;
pre(v,x);
}
}
inline void dfs(int x){
f[0][x][0]=f[1][x][0]=1;
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
if(v==fa[x])continue;
dfs(v);
for(int j=n;j>=1;j--)
for(int k=0;k<j;k++){
if(j-k>=2)
f[1][x][j]=max(f[1][x][j],f[1][v][k]+f[1][x][j-k-2]),
f[0][x][j]=max(f[0][x][j],f[1][v][k]+f[0][x][j-k-2]);
f[0][x][j]=max(f[0][x][j],f[0][v][k]+f[1][x][j-k-1]);
}
}
for(int i=1;i<=n;i++)
f[0][x][i]=max(f[0][x][i],f[0][x][i-1]),
f[1][x][i]=max(f[1][x][i],f[1][x][i-1]);
}
int main(){
m=read();n=read();
for(int i=1;i<m;i++){
int u,v;
u=read()+1;v=read()+1;
add(u,v);add(v,u);
}
pre(1,0);
//for(int i=1;i<=n;i++)cout<<fa[i]<<" ";cout<<endl;
dfs(1);
cout<<f[0][1][n];
return 0;
}
https://www.luogu.com.cn/problem/P4438
处理树二选一减小空间可以编号处理,每次处理一条链,这样最多需要的编号个数就是链的长度
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
const int N=4e4+10;
const int inf=0x3f3f3f3f;
int n,son[N][2],dfsx[N],f[200][50][50];
struct Satin{
int a,b,c;
}rural[N];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
inline void dfs(int x,int id,int L,int R){
dfsx[x]=id;
if(x>=n){
for(int i=0;i<=L;i++)
for(int j=0;j<=R;j++)
f[dfsx[x]][i][j]=1ll*rural[x-n+1].c*1ll*(rural[x-n+1].a+i)*1ll*(rural[x-n+1].b+j);
return ;
}
dfs(son[x][0],id+1,L+1,R);dfs(son[x][1],id+2,L,R+1);
for(int i=0;i<=L;i++)
for(int j=0;j<=R;j++)
f[dfsx[x]][i][j]=min(1ll*f[dfsx[son[x][0]]][i][j]+f[dfsx[son[x][1]]][i][j+1],
1ll*f[dfsx[son[x][0]]][i+1][j]+f[dfsx[son[x][1]]][i][j]);
}
signed main(){
//memset(f,inf,sizeof(f));
n=read();
for(int i=1;i<n;i++){
int u,v;
u=read();v=read();
if(u<0)u=-u+n-1;
if(v<0)v=-v+n-1;
son[i][0]=u;son[i][1]=v;
}
for(int i=1;i<=n;i++)rural[i].a=read(),rural[i].b=read(),rural[i].c=read();
dfs(1,1,0,0);
cout<<f[dfsx[1]][0][0];
return 0;
}
2.3 区间DP
https://www.luogu.com.cn/problem/P4302
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=110;
const int inf=0x3f3f3f3f;
int f[N][N],len[N];
string s;
inline int check(int L,int R,int lenth){
for(int i=L;i<=R;i++)if(s[i]!=s[L+(i-L)%lenth])return 0;
return 1;
}
int main(){
cin>>s;
for(int i=1;i<=100;i++){
if(i<10)len[i]=1;
else if(i<100)len[i]=2;
else len[i]=3;
}
int n=s.length();
s=' '+s;
memset(f,inf,sizeof(f));
for(int i=1;i<=n;i++)f[i][i]=1;
for(int l=2;l<=n;l++)
for(int i=1;i+l-1<=n;i++){
int j=i+l-1;
for(int k=i;k<j;k++)f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
for(int k=1;k<l;k++)if(l%k==0)
if(check(i,j,k))f[i][j]=min(f[i][j],f[i][i+k-1]+2+len[l/k]);
}
cout<<f[1][n];
return 0;
}
https://www.luogu.com.cn/problem/P3847
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=3010;
int n,a[N],f[N][N];
int main(){
IOS;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int l=2;l<=n;l++)
for(int i=1;i+l-1<=n;i++){
int j=i+l-1;
if(a[i]==a[j])f[i][j]=f[i+1][j-1];
else f[i][j]=min(f[i+1][j-1],min(f[i][j-1],f[i+1][j]))+1;
}
cout<<f[1][n];
return 0;
}
2.4 概率DP
https://www.luogu.com.cn/problem/P2059
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=55;
int n,m,a[N];
double f[N][N];
int main(){
cin>>n>>m;
f[1][1]=1.0;
for(int i=1;i<=m;i++)cin>>a[i];
for(int i=2;i<=n;i++){
for(int k=1;k<=m;k++){
int aim=a[k]%i?a[k]%i:i;
for(int j=1;j<i;j++){
aim=aim+1>i?1:aim+1;
f[i][aim]+=f[i-1][j]/(double)m;
}
}
}
for(int i=1;i<=n;i++)printf("%.2lf%% ",f[n][i]*100);
return 0;
}
2.5 二进制优化
https://www.luogu.com.cn/problem/P4095
完全背包
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
const int N=1010;
int n,m,cnt,pre[N*10][N],suf[N*10][N],L[N*10],R[N*10];
struct node{
int cost,val,id;
}a[N*N];
signed main(){
IOS;
cin>>n;
for(int i=1;i<=n;i++){
int cost,val,num;
cin>>cost>>val>>num;
L[i]=cnt;
for(int j=1;j<=num;j*=2){
++cnt;
a[cnt].cost=cost*j;a[cnt].val=val*j;
a[cnt].id=i;
num-=j;
}
if(num)
a[++cnt].cost=cost*num,a[cnt].val=val*num,a[cnt].id=i;
R[i]=cnt+1;
}
for(int i=1;i<=cnt;i++){
memcpy(pre[i],pre[i-1],sizeof(pre[i-1]));
for(int j=1000;j>=a[i].cost;j--)
pre[i][j]=max(pre[i][j],pre[i-1][j-a[i].cost]+a[i].val);
}
for(int i=cnt;i>=1;i--){
memcpy(suf[i],suf[i+1],sizeof(suf[i+1]));
for(int j=1000;j>=a[i].cost;j--)
suf[i][j]=max(suf[i][j],suf[i+1][j-a[i].cost]+a[i].val);
}
cin>>m;
for(int i=1;i<=m;i++){
int limit,maxn;
cin>>limit>>maxn;
++limit;
int ans=0;
for(int j=0;j<=maxn;j++)
ans=max(ans,pre[L[limit]][j]+suf[R[limit]][maxn-j]);
cout<<ans<<endl;
}
return 0;
}
3. 基础算法
3.1 贪心
https://www.luogu.com.cn/problem/UVA1344
田忌告诉我说他不想赛马!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=1024;
int n,a[N],b[N],ans=0;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int main(){
freopen("uva1344.out","w",stdout);
while(~scanf("%d",&n)&&n){
for(int i=1;i<=n;i++)a[i]=read();
for(int j=1;j<=n;j++)b[j]=read();
sort(a+1,a+n+1);
sort(b+1,b+n+1);
ans=0;
int aL=1,bL=1,aR=n,bR=n;
for(int i=1;i<=n;i++){
if(a[aR]>b[bR])ans+=200,--aR,--bR;
else if(a[aR]<b[bR])ans-=200,++aL,--bR;
else if(a[aL]>b[bL])ans+=200,++aL,++bL;
else{
if(a[aL]<b[bR])ans-=200;
++aL,--bR;
}
}
cout<<ans<<endl;
}
return 0;
}
https://www.luogu.com.cn/problem/P3963
那啥,实际上咱可以用单调队列水的……
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
const int N=2e5+10;
typedef long long ll;
int n,m,W,ai[N];
ll summaxn,summinn,maxn[N],minn[N];
struct node{
int score,val;
bool operator <(const node &b)const{
return score<b.score;
}
}a[N];
priority_queue<int>qmaxn;
priority_queue<int>qminn;
signed main(){
IOS;
cin>>m>>n>>W;
for(int i=1;i<=n;i++)cin>>a[i].score>>a[i].val,ai[i]=a[i].score;
sort(ai+1,ai+n+1);
int len=unique(ai+1,ai+n+1)-ai-1;
for(int i=1;i<=n;i++)a[i].score=lower_bound(ai+1,ai+len+1,a[i].score)-ai;
sort(a+1,a+n+1);
//cout<<"sort "<<endl;
//for(int i=1;i<=n;i++)cout<<a[i].score<<" "<<a[i].val<<endl;
int ans=-1;
for(int i=1;i<=n;i++){
while(qminn.size()>m/2)summinn-=qminn.top(),qminn.pop();
minn[i]=summinn;
summinn+=a[i].val,qminn.push(a[i].val);
}
for(int i=n;i>=1;i--){
while(qmaxn.size()>m/2)summaxn-=qmaxn.top(),qmaxn.pop();
maxn[i]=summaxn;
summaxn+=a[i].val,qmaxn.push(a[i].val);
}
/*cout<<"minn"<<endl;
for(int i=1;i<=n;i++)cout<<minn[i]<<" ";cout<<endl;
cout<<"maxn"<<endl;
for(int i=1;i<=n;i++)cout<<maxn[i]<<" ";cout<<endl;*/
for(int i=m/2+1;i<=n-m/2;i++)if(minn[i]+a[i].val+maxn[i]<=W)ans=ai[a[i].score];
cout<<ans;
return 0;
}
https://www.luogu.com.cn/problem/P3845
又是奶牛挤奶,但我依旧48pts,望天,心好累,心好塞~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=1010;
int t,n,top;
struct node{
int x,y;
bool operator <(const node &b)const{
return y==b.y?x<b.x:y<b.y;
}
}a[N],endi[N];
int main(){
IOS;
cin>>t;
while(t--){
memset(&endi,0,sizeof(endi));
top=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
a[i].y*=-1;
if(a[i].x>a[i].y)swap(a[i].x,a[i].y);
}
sort(a+1,a+n+1);
//cout<<"sort "<<endl;
//for(int i=1;i<=n;i++)cout<<a[i].x<<" "<<a[i].y<<endl;
top=1;
endi[1]=a[1];
for(int i=2;i<=n;i++){
int flag=0;
for(int j=1;j<=top;j++){
if(a[i].x>=endi[j].x){
endi[j]=a[i];
flag=1;
break;
}
}
if(!flag)endi[++top]=a[i];
}
cout<<top<<endl;
}
return 0;
}
3.2 递推
https://www.luogu.com.cn/problem/P3856
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
#define int long long
const int N=110;
int f[N][N][N],lastia[N],lastib[N],lastic[N];
char a[N],b[N],c[N];
signed main(){
scanf("%s",a+1);scanf("%s",b+1);scanf("%s",c+1);
int lena=strlen(a+1),lenb=strlen(b+1),lenc=strlen(c+1);
for(int i=1;i<=lena;i++){
lastia[a[i]-'a'+1]=i;
memset(lastib,0,sizeof(lastib));
for(int j=1;j<=lenb;j++){
lastib[b[j]-'a'+1]=j;
memset(lastic,0,sizeof(lastic));
for(int k=1;k<=lenc;k++){
lastic[c[k]-'a'+1]=k;
for(int d=1;d<=26;d++){
int ai=lastia[d],bi=lastib[d],ci=lastic[d];
if(!ai||!bi||!ci)continue;
f[i][j][k]+=f[ai-1][bi-1][ci-1]+1;
//利用容斥原理,反正就是把各种情况分别揪出来
//一共有26种,也就是分别以26种英文字母结尾
//而且没揪出来一种就额外多增加一种子串——原来重复的字母+1
//并且以前被更新过的数组不会被重复更新
//这是递推
}
}
}
}
cout<<f[lena][lenb][lenc];
return 0;
}
4.图论
4.1 Tarjan(强连通分量)
https://www.luogu.com.cn/problem/P4306
注意:
最后计算总数的时候要给点边计算边染色,否则会出现有两个点都连接到同一个
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=2010;
int n,cnt,tot,head[N],sizei[N],belong[N],vis[N],low[N],dfn[N],ind;
int cnti,headi[N],ru[N],fin[N];
struct node{
int from,to,next;
}a[N*N],ai[N*N];
stack<int>stacki;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
inline void add(int u,int v){
++cnt;
a[cnt].from=u;
a[cnt].to=v;
a[cnt].next=head[u];
head[u]=cnt;
}
inline void addi(int u,int v){
++cnti;
ai[cnti].from=u;
ai[cnti].to=v;
ai[cnti].next=headi[u];
headi[u]=cnti;
}
inline void Tarjan(int x){
low[x]=dfn[x]=++ind;
stacki.push(x);
vis[x]=1;
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
if(!dfn[v]){
Tarjan(v);
low[x]=min(low[x],low[v]);
}else if(vis[v])low[x]=min(low[x],dfn[v]);
}
int k=0;
if(low[x]==dfn[x]){
++tot;
do{
k=stacki.top();stacki.pop();
vis[k]=0;
belong[k]=tot;
++sizei[tot];
}while(k!=x);
}
}
inline void dfs(int x,int fa){
fin[x]=sizei[x];
for(int i=headi[x];i;i=ai[i].next){
int v=ai[i].to;
if(v==fa)continue;
if(vis[v])continue;
vis[v]=1;
dfs(v,x);
fin[x]+=fin[v];
}
}
int main(){
n=read();
for(int i=1;i<=n;i++){
string s;cin>>s;
for(int j=1;j<=n;j++)if(s[j-1]=='1')add(i,j);
}
for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
/*cout<<"belong "<<endl;
for(int i=1;i<=n;i++)cout<<belong[i]<<" ";cout<<endl;
cout<<"sizei "<<endl;
for(int i=1;i<=tot;i++)cout<<sizei[i]<<" ";cout<<endl;
cout<<"addi "<<endl;*/
for(int i=1;i<=cnt;i++)
if(belong[a[i].from]!=belong[a[i].to])
addi(belong[a[i].from],belong[a[i].to]),++ru[belong[a[i].to]];//,cout<<belong[a[i].from]<<" "<<belong[a[i].to]<<endl;
//if(cnti==0)return cout<<n*n,0;
//cout<<"ru "<<endl;
//for(int i=1;i<=tot;i++)cout<<ru[i]<<" ";cout<<endl;
memset(vis,0,sizeof(vis));
for(int i=1;i<=tot;i++)if(!ru[i])dfs(i,i);
int ans=0;
//cout<<"fin "<<endl;
for(int i=1;i<=tot;i++)ans+=fin[i]*sizei[i];//,cout<<fin[i]<<" ";cout<<endl;
cout<<ans;
return 0;
}
/*
5
01000
00110
10000
00000
00010
ans 15
*/
4.2 DFS
https://www.luogu.com.cn/problem/P3848
对于暴搜,我选择把它转化成图再暴搜/斜眼笑/手动狗头
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=1e4+10;
int n,start,endi,cnt,top,head[N],id[110][110],mapi[110][110],vis[N];
long long ans;
struct node{
int to,next,val;
}a[N*200];
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
inline void add(int u,int v,int w){
++cnt;
a[cnt].to=v;
a[cnt].val=w;
a[cnt].next=head[u];
head[u]=cnt;
}
inline void dfs(int x,long long tot){
ans=max(ans,tot);
for(int i=head[x];i;i=a[i].next){
int v=a[i].to;
if(vis[v])continue;
vis[v]=1;
dfs(v,tot+a[i].val);
vis[v]=0;
}
}
int main(){
n=read();start=read();endi=read();
//cout<<"add "<<endl;
for(int i=1;i<=n;i++){
int lasti=0,x=0,y=0;
for(int j=1;j<=n;j++){
mapi[i][j]=read();
if(!mapi[i][j])id[i][j]=++top;
if(!mapi[i][j]&&!lasti)lasti=id[i][j],x=i,y=j;
else if(!mapi[i][j]&&lasti){
int val=abs(x-i)+abs(y-j);
if(val<=1)goto aa;
add(lasti,top,val);add(top,lasti,val);
//cout<<lasti<<" "<<top<<" "<<val<<endl;
aa:
lasti=top,x=i,y=j;
}
}
}
for(int j=1;j<=n;j++){
int lasti=0,x=0,y=0;
for(int i=1;i<=n;i++){
if(id[i][j]&&!lasti)lasti=id[i][j],x=i,y=j;
else if(id[i][j]&&lasti){
int val=abs(x-i)+abs(y-j);
if(val<=1)goto bb;
add(lasti,id[i][j],val);add(id[i][j],lasti,val);
//cout<<lasti<<" "<<id[i][j]<<" "<<val<<endl;
bb:
lasti=id[i][j],x=i,y=j;
}
}
}
/*cout<<"id "<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)cout<<id[i][j]<<" ";
cout<<endl;
}
cout<<endl;*/
vis[id[start][endi]]=1;
dfs(id[start][endi],0);
cout<<ans;
return 0;
}
2021.12.16 eleveni的刷题记录的更多相关文章
- 2021.12.21 eleveni的刷题记录
2021.12.21 eleveni的刷题记录 0. 有意思的题 P6701 [POI1997] Genotype https://www.luogu.com.cn/problem/P6701 状压优 ...
- 2021.12.19 eleveni的刷题记录
2021.12.19 eleveni的刷题记录 0. 本次记录有意思的题 0.1 每个点恰好经过一次并且求最小时间 P2469 [SDOI2010]星际竞速 https://www.luogu.com ...
- [BUUCTF-Pwn]刷题记录1
[BUUCTF-Pwn]刷题记录1 力争从今天(2021.3.23)开始每日至少一道吧--在这里记录一些栈相关的题目. 最近更新(2021.5.8) 如果我的解题步骤中有不正确的理解或不恰当的表述,希 ...
- 攻防世界Web刷题记录(新手区)
攻防世界Web刷题记录(新手区) 1.ViewSource 题如其名 Fn + F12 2.get post 3.robots robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个 ...
- 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System
目录 刷题记录:[CISCN2019 东北赛区 Day2 Web3]Point System 知识点 1.padding-oracle attack 2.cbc字节翻转攻击 3.FFMpeg文件读取漏 ...
- 刷题记录:[CISCN 2019 初赛]Love Math
目录 刷题记录:[CISCN 2019 初赛]Love Math 思路一 思路二 总结 刷题记录:[CISCN 2019 初赛]Love Math 题目复现链接:https://buuoj.cn/ch ...
- 刷题记录:[De1ctf] shell shell shell
目录 刷题记录:[De1ctf] shell shell shell 一.知识点 1.源码泄露 2.正则表达式不完善导致sql注入 3.soapclient反序列化->ssrf 4.扫描内网 5 ...
- 刷题记录:[LCTF]bestphp's revenge
目录 刷题记录:[LCTF]bestphp's revenge 一.知识点 1.SoapClient触发反序列化导致ssrf 2.serialize_hander处理session方式不同导致sess ...
- 刷题记录:[SUCTF 2019]CheckIn
目录 刷题记录:[SUCTF 2019]CheckIn 一.涉及知识点 1.利用.user.ini上传\隐藏后门 2.绕过exif_imagetype()的奇技淫巧 二.解题方法 刷题记录:[SUCT ...
随机推荐
- Activemq持久化之kahadb特性
介绍数据的持久化是很多系统都会涉及到的一个问题,尤其是redis,activemq这些数据主要是存储在内存中的.既然存在内存中,就会面临宕机时数据丢失的风险.这一问题的解决方案就是通过某种方式将数据写 ...
- [转载]nc命令详解
最近在搞反向连接,试来试去发现最好的工具还是nc.正好趁这个机会把nc的用法总结一下: 1.端口扫描: nc -vv ip port 例:nc -vv 192.168.1.1 5000 扫描192.1 ...
- JdbcTemplate ?
JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据 类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处 理.
- 如何通过HibernateDaoSupport将Spring和Hibernate 结合起来?
用 Spring 的 SessionFactory 调用 LocalSessionFactory.集成过程分三步: 配置 the Hibernate SessionFactory. 继承 Hibern ...
- We're sorry but demo3 doesn't work properly without JavaScript enabled. Please enable it to continue.
今天遇到一个问题为 vue请求得到的响应为 We're sorry but demo3 doesn't work properly without JavaScript enabled. Please ...
- final、finalize 和 finally 的不同之处?
final 是一个修饰符,可以修饰变量.方法和类.如果 final 修饰变量,意味着该 变量的值在初始化后不能被改变.finalize 方法是在对象被回收之前调用的方法, 给对象自己最后一个复活的机会 ...
- 什么是 Spring beans?
Spring beans 是那些形成 Spring 应用的主干的 java 对象.它们被 Spring IOC 容器初始化,装配,和管理.这些 beans 通过容器中配置的元数据创建.比如, 以 XM ...
- 学习SVN01
SVN服务器搭建实录 第一章 SVN介绍 1.1 什么是SVN(subversion) SVN是近年来崛起的非常优秀的版本管理工具,与CVS管理工具一样,SVN是一个固态的跨平台的开源的版本控制 ...
- Numpy的数学统计函数
Numpy的数学统计函数 本节内容: 1.Numpy有哪些数学统计函数: 函数名 说明 np.sum 所有元素的和 np.prod 所有元素的乘积 np.cumsum 元素的累积加和 np.cumpr ...
- canvas元素内容生成图像文件
准备工作 想要将canvas元素当前显示的内容生成为图像文件,我们首先要获取canvas中的数据,在HTML5 <canvas>元素的标准中提供了toDataURL()的方法可以将canv ...