T1

考试的时候打的暴力,快结束的时候,脑抽加了个 long long,然后就...

痛失70pts QAQ。

Your source code compiled to 8015900 bytes which is too big, too thick, too long for us..
#include<cstdio>
#include<algorithm>
#define MAX 1000001
#define re register
#define int long long
namespace OMA
{
int n,k,cnt;
int ans[MAX],b[MAX]={1};
inline int read()
{
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*w;
}
signed main()
{
n = read(),k = read();
ans[++cnt] = 0;
for(re int i=1; i<=n; i++)
{
int a = read();
for(re int j=1; j<=k; j++)
{
int tmp = a*j%k;
if(!b[tmp])
{ ans[++cnt] = tmp; b[tmp] = 1; }
}
}
std::sort(ans+1,ans+1+cnt);
printf("%lld\n",cnt);
for(re int i=1; i<=cnt; i++)
{ printf("%lld ",ans[i]); }
return 0;
}
}
signed main()
{ return OMA::main(); }

又大又厚又长

其实跟正解就差一个gcd了,其他基本就都一样,就gcd,害。

然后我考试的时候,还想着去找循环节,后来发现没啥用,就扔了个暴力走了。

正解:

\(ax+by=z\) 有解的充要条件是 \(gcd(a,b)|z\),所以求 \(gcd(a_{1},a_{2},....a_{n})\) ,然后直接枚举其模 \(k\) 意义下的倍数,统计答案即可。

求倍数的时候可能会暴int ,或者出现负数,注意一下。

然后,xin写的模拟退火,经它观察,答案为等比序列,所以去找公差,找到什么时候呢?,0.85s的时候就差不多了,然后就统计答案,大概率是对的目前卡不掉

Code
#include<cstdio>
#include<algorithm>
#define MAX 1000010
#define re register
namespace OMA
{
int n,k,cnt;
int ans[MAX],b[MAX]={1};
inline int read()
{
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*w;
}
inline int gcd(int a,int b)
{ return b?gcd(b,a%b):a; }
signed main()
{
n = read(),k = read();
int p = 0;
ans[++cnt] = 0;
for(re int i=1; i<=n; i++)
{ p = gcd(read(),p); }
for(re int i=1; i<=k-1; i++)
{ int tmp = (1LL*p*i%k+k)%k; if(!b[tmp]){ ans[++cnt] = tmp; b[tmp] = 1; }; }
std::sort(ans+1,ans+1+cnt);
printf("%d\n",cnt);
for(re int i=1; i<=cnt; i++)
{ printf("%d ",ans[i]); }
return 0;
}
}
signed main()
{ return OMA::main(); }

T2

考试的时候,想的按 \(a\) 来排序,然后直接dp,然而它是二维的,不能直接sort,就去想怎么压到一维,觉得有些麻烦,结果两行了事,记一下x,y就好,此时t3还没看,就去写t3了。

首先dp方程,设 \(dp_{i,j}\) 表示到i,j时最大的吸引度之和,则有,

\[dp_{i,j}=\max(dp_{i',j'}+b_{i,j}+\left\vert i-i' \right\vert+\left\vert j-j' \right\vert)
\]

40pts,直接暴力转移。

80pts,考虑优化,方程中有abs,套路的想到将其拆成,

\[dp_{i,j}+i+j
\]
\[dp_{i,j}+i-j
\]
\[dp_{i,j}-i+j
\]
\[dp_{i,j}-i-j
\]

即从左上,左下,右上,右下四个地方转移过来跟上边的式子顺序可能对不上,然后就可以用树状数组来维护其最大值,今天才知道的套路

100pts,其实用不着树状数组,坐标的差如果为负数的话,肯定不是最优的,所以直接用四个变量来维护即可。

dp方程没必要是二维的,可以直接统计个数,搞成一维的。

记得开long long

Code
#include<cstdio>
#include<algorithm>
#define MAX 2001
#define re register
#define int long long
namespace OMA
{
int n,m;
int tmp[4][2];
int dp[MAX*MAX],ans;
struct node
{
int a,b;
int x,y;
friend bool operator <(const node &a,const node &b)
{ return a.a<b.a;; }
}ar[MAX*MAX];
int a[MAX][MAX],b[MAX][MAX];
inline int read()
{
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9'){ if(ch=='-')w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); }
return s*w;
}
inline int max(int a,int b)
{ return a>b?a:b; }
inline void work(int i)
{
tmp[0][0] = max(tmp[0][0],dp[i]+ar[i].x+ar[i].y);
tmp[1][0] = max(tmp[1][0],dp[i]+ar[i].x-ar[i].y);
tmp[2][0] = max(tmp[2][0],dp[i]-ar[i].x+ar[i].y);
tmp[3][0] = max(tmp[3][0],dp[i]-ar[i].x-ar[i].y);
}
signed main()
{
int cnt = 0,head;
n = read(),m = read();
for(re int i=1; i<=n; i++)
{
for(re int j=1; j<=m; j++)
{ a[i][j] = read(); }
}
for(re int i=1; i<=n; i++)
{
for(re int j=1; j<=m; j++)
{
b[i][j] = read();
if(a[i][j])
{ ar[++cnt] = (node){a[i][j],b[i][j],i,j}; }
}
}
std::sort(ar+1,ar+1+cnt);
dp[1] = ar[1].b,work(1);
for(re int i=2; i<=cnt; i++)
{
if(ar[i].a!=ar[i-1].a)
{ head = i; break ; }
dp[i] = ar[i].b,work(i);
}
for(re int i=head; i<=cnt; i++)
{
if(ar[i].a!=ar[i-1].a)
{
for(re int j=0; j<=3; j++)
{ tmp[j][1] = tmp[j][0],tmp[j][0] = 0; }
}
int a = tmp[0][1]-ar[i].x-ar[i].y;
int b = tmp[1][1]-ar[i].x+ar[i].y;
int c = tmp[2][1]+ar[i].x-ar[i].y;
int d = tmp[3][1]+ar[i].x+ar[i].y;
ans = max(ans,dp[i] = max(max(a,b),max(c,d))+ar[i].b);
work(i);
}
printf("%lld\n",ans);
return 0;
}
}
signed main()
{ return OMA::main(); }

T3

跳过t2后,看的t3,暴力很好打,很快就码好了,20pts到手,去看测试点特征,对于仅有0,1的点,opt=1,答案即为0,1个数之积,opt=2显然答案为0,+=20pts,数错数了,20挂掉了。

暴力找最大值显然不可行,所以想到了单调队列单调栈,然而写挂了,去想别的方法去优化,然后莫名其妙的想到了树套树区间最大值,显然树套树,学fhq-treap学傻了,还没码完,考试结束了。

正解是可持久化Trie。还不会,所以去学了。

没改出来,先咕了

noip11的更多相关文章

  1. [Luogu 1312] noip11 Mayan游戏

    [Luogu 1312] noip11 Mayan游戏 Problem: Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即 ...

  2. noip11 string

    这道题改题时我打了个玄学复杂度的暴力,然后我成功的造了一组数据hack掉了自己的代码.... 通过观察,我们可以很容易的发现在操作几次后,整个序列就会变成一块一块相同的字母. 于是我们可以对我们的暴力 ...

  3. [NOIP11.1模拟赛]补番报告

    Preface 昨天开始补某科学的超电磁炮S 感觉今天就好了点,炮姐赛高 T1 一开始一直想欧拉定理&ex欧拉定理,结果估计70分,数组开小了GG,看了正解发现是我学傻了 T2 一看就是数据结 ...

  4. noip模拟12[简单的区间·简单的玄学·简单的填数]

    noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...

随机推荐

  1. Oracle_RAC共享存储

    <<ASM.sh>> 第2-3步可以使用"附件ASM.sh"脚本执行 此操作说明,此操作在2个节点都执行(可以复制) 编辑/etc/scsi_id.conf ...

  2. Codeforces Round #139 (Div. 2) 题解

    vp上古场次ing CF225A Dice Tower 1.题目简述: 有 \(n\) 个骰子被叠在了一起.对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) . 你是小明,你只能从正面看这个 ...

  3. Luogu P2051「AHOI2009」中国象棋

    看见第一眼觉得是状压 \(\text{DP}\)?观察数据范围发现不可做 那按照最常规思路设状态试试? 设状态为\(dp[i][j]\)表示\(i*j\)的棋盘的方案数 好像转移不了欸 要不再来一维? ...

  4. MySQL字符串操作函数

    使用方法:concat(str1,str2,-)   返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. mysql> select concat('11',' ...

  5. C语言:输出数字各个位的数字及和

    #include <stdio.h> int main() { char sh[13][5]={"个","十","百",&quo ...

  6. 将已经基本完成的项目推送到gitee上管理

    1,首先在gitee上创建仓库,保留一个.gitigonore就行,这样就得到一个远程仓库地址 2,仓库有文件,那么就需要先将这个文件pull下来: 在本地的项目目录中执行:git init git ...

  7. unar命令解压zip文件,解决中文乱码。

    unzip解压时,常出现中文乱码.可用unar来代替.

  8. 【洛谷P1816 忠诚】线段树

    题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...

  9. 【Lucas组合数定理+中国剩余定理】Mysterious For-HDU 4373

    Mysterious For-HDU 4373 题目描述 MatRush is an ACMer from ZJUT, and he always love to create some specia ...

  10. gitbook导出markdown文件为pdf格式

    前言本人想完成如题所示的操作,可是兜兜转转在网上搜了好久,不是Linux下的教程就是mac OS下的教程,而且一大堆windows的教程能够说明白的寥寥无几,本着分享的态度,鄙人今天特整理教程如下: ...