自從上紫後打的四場四連跪,總共掉了200分,開始懷疑人生。
昨天晚上5點打組隊賽,然後10點半打cf,當時就比較困了,但這div2過了2題也太說不過去了,跟上一場犯的錯誤一模一樣,當C做不出來就死磕,應該果斷點放棄的,D題明顯是個簡單題,最後又因爲沒有時間而敲不完。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100050;
int a[maxn];
int main()
{
int n,t,m;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
int ans=min(sum,m);
printf("%d\n",ans);
}
return 0;
}
題解:
對與i,最後形成的字符串是(i,末尾)+ A.A爲字符串(1,i-1),當字符串長度和i的奇偶性相同時A需要反轉。
這樣每個i的字符串就得到了,然後n^2的比較大小就行。
比賽的時候寫複雜了,字符串應該是可以直接比較的,不需要自己寫比較,直接維護字典序最小的字符串即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5050;
char s[maxn];
char a[maxn][maxn];
int vis[maxn];
int main()
{
int n,t,m;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
scanf("%s",s+1);
int flag=0;
for(int i=1;i<=n;i++){
int cnt=0;
for(int j=i;j<=n;j++) a[i][++cnt]=s[j];
int f=(n%2)^(i%2);
//printf("%d!\n",f);
if(f){
for(int j=1;j<i;j++) a[i][++cnt]=s[j];
}
else for(int j=i-1;j>=1;j--) a[i][++cnt]=s[j];
vis[i]=0;
}
int id;
for(int j=1;j<=n;j++){
char mi='z';
int num=0;
for(int i=1;i<=n;i++){
if(vis[i]) continue;
if(a[i][j]<mi){
mi=a[i][j];
num=1;
id=i;
}
else if(a[i][j]==mi) num++;
}
if(num==1){
flag=1;
for(int i=1;i<=n;i++) printf("%c",a[id][i]);
printf("\n%d\n",id);
break;
}
else{
for(int i=1;i<=n;i++){
if(vis[i]) continue;
if(a[i][j]>mi) vis[i]=1;
}
}
}
if(!flag){
for(int j=1;j<=n;j++) printf("%c",a[id][j]);
printf("\n%d\n",id);
}
}
return 0;
}
題意:給出兩個多項式a,b的係數,兩個多項式相乘後的多項式爲c,求任意一個下標t,該位置的係數不能被p整除
題解:
設t=i+j,i爲a[]第一個不被p整除的下標,j爲b[]第一個不被p整除的下標
t位置的係數=a[0]*b[i+j]+a[1]*b[i+j-1]...a[i]*b[j]...a[i+j]*b[0]
a[0]到a[i-1]每一個都能被p整除,b[0]到b[j-1]每一個都能被p整除
所以上面的式子只有a[i]*b[j]這個式子不被p整除,其他都是p的倍數,去掉即可
這樣最後係數=a[i]*b[j],這一定不能被p整除
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
inline int read()
{
register int X=0;
register char ch=0;
while(ch<48||ch>57)ch=getchar();
while(ch>=48&&ch<=57)X=X*10+(ch^48),ch=getchar();
return X;
}
int a[maxn],b[maxn];
int main()
{
ll n,m,p;
scanf("%lld%lld%lld",&n,&m,&p);
for (int i=0;i<n;i++)a[i]=read();
for (int i=0;i<m;i++)b[i]=read();
int x=-1,y=-1;
for(int i=0;i<n;i++){
if(a[i]%p!=0){
x=i;
break;
}
}
for(int i=0;i<m;i++){
if(b[i]%p!=0){
y=i;
break;
}
}
printf("%d\n",x+y);
return 0;
}
題意:
n*n的矩陣,每個單元mp[][]是L,R,U,D,X中的一種,分別代表往左,右,上下走,不動。輸入a[][]的矩陣代表每個單元,從該單元開始到某個單元結束停止不動的座標。(-1,-1),代表從該單元走陷入了死循環。給你a[][]矩陣,讓你反推mp[][]看是否存在
題解:
分類討論
1)不是陷入死循環的單元。當每個單元的座標等於該單元終點的座標時,將該單元放入隊列,然後從該單元反推開始bfs()
2)陷入死循環的單元。不需要從開頭一直走,一直走,再走回開頭。只需要讓該單元與相鄰也是(-1,-1)的單元這兩個單元陷入死循環即可,然後bfs2()讓其他(-1,-1)的點走到這兩個單元就行
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1050;
struct node{
int x,y;
}a[maxn][maxn];
int vis[maxn][maxn],dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}},n;
char mp[maxn][maxn];
char d1[10]="RDLU",di[10]="LURD";
int solve(node x){
return ((a[x.x][x.y].x-1)*n+a[x.x][x.y].y);
}
queue<node>q;
node v;
void bfs(){
while(!q.empty()){
node u=q.front();q.pop();
for(int i=0;i<4;i++){
v.x=u.x+dir[i][0];v.y=u.y+dir[i][1];
if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x==-1) continue;
if(solve(v)==vis[u.x][u.y]){
vis[v.x][v.y]=solve(v);
mp[v.x][v.y]=di[i];
q.push(v);
}
}
}
}
void bfs2(){
while(!q.empty()){
node u=q.front();q.pop();
for(int i=0;i<4;i++){
v.x=u.x+dir[i][0];v.y=u.y+dir[i][1];
if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x!=-1) continue;
vis[v.x][v.y]=1;
mp[v.x][v.y]=di[i];
q.push(v);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d%d",&a[i][j].x,&a[i][j].y);
if(a[i][j].x==i&&a[i][j].y==j){
vis[i][j]=(i-1)*n+j;
q.push(a[i][j]);
mp[i][j]='X';
}
}
}
bfs();
int flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j].x!=-1||vis[i][j]) continue;
int num=0;
for(int ii=0;ii<4;ii++){
v.x=i+dir[ii][0];v.y=j+dir[ii][1];
if(v.x<1||v.y<1||v.x>n||v.y>n||vis[v.x][v.y]||a[v.x][v.y].x!=-1) continue;
vis[v.x][v.y]=1;vis[i][j]=1;
mp[i][j]=d1[ii];mp[v.x][v.y]=di[ii];
q.push(v);
v.x=i;v.y=j;q.push(v);
num=1;
break;
}
if(!num){
flag=1;
break;
}
bfs2();
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(vis[i][j]==0){
flag=1;
break;
}
}
}
if(flag){
printf("INVALID\n");
return 0;
}
printf("VALID\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%c",mp[i][j]);
}
printf("\n");
}
return 0;
}