10.11NOIP模拟题(3)


/*
可以看出,对于一段区间[L,R]如果统计了答案
若a[L]<a[R],那么当右端点往左移时答案不会更优,a[R]>a[L]同理
所以两个指针分别从头尾往中间扫那边小移哪边即可。
*/
#include<bits/stdc++.h> #define N 1000007
#define ll long long using namespace std;
ll a[N];
ll n,m,ans,cnt; int main()
{
freopen("w.in","r",stdin);
freopen("w.out","w",stdout);
scanf("%lld",&n);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
int L=,R=n;
while(L<=R)
{
ll res=(R-L+)*min(a[L],a[R]);
ans=max(ans,res);
if(a[L]>=a[R]) R--;
else L++;
}
cout<<ans<<endl;
return ;
}

/*
发现算来算去所有数的二进制1的个数和位置不会变。
两个数and 或 or只是把他们的二进制位的1聚拢到一个数上。
若两个数为a,b,假设他们进行一次操作后变为(a+x),(b-x),则a>b
那么(a+x)^2+(b-x)^2=a^2+b^2+2x(x+a-b)>a^2+b^2
说明这种“聚拢”操作后平方和会变大
所以把所有数的二进制位1统计下来后尽可能的对分给一个数即可。
*/
#include<bits/stdc++.h> #define mod 998244353
#define N 10005 using namespace std;
int n,x;
int cnt[N]; int main()
{
freopen("s.in","r",stdin);
freopen("s.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d",&x);
for (int j=;j<;j++) if (x & (<<j)) cnt[j]++;
}
unsigned long long ans=;
for(int i=;i<n;i++)
{
x=;
for(int j=;j<;j++) if (cnt[j]) x |=(<<j),cnt[j]--;
ans+=(unsigned long long)(x)*x%mod;;
}
cout<<ans%mod;
return ;
}


#include<bits/stdc++.h> #define N 30
#define ll long long
#define mod 1000000007
#define opt 99999 using namespace std;
int n,m,k,lim;
ll ans;
int dx[]={,,,-};
int dy[]={,-,,};
int vis[N][N],f[N][N]; inline ll read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} bool can(int x,int y)
{
if(vis[x][y]==-) return false;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]>=opt) return false;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]>=opt) return false;
if(vis[x-][y-]>=opt || vis[x-][y+]>=opt) return false;
if(vis[x+][y+]>=opt || vis[x+][y-]>=opt) return false;
return true;
} void update(int x,int y)
{
vis[x][y]=opt;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]!=-)vis[x][i]++;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]!=-)vis[i][y]++;
if(x- && y- && vis[x-][y-]!=-) vis[x-][y-]++;
if(x- && y+<=m && vis[x-][y+]!=-) vis[x-][y+]++;
if(x+<=n && y- && vis[x+][y-]!=-) vis[x+][y-]++;
if(x+<=n && y+<=m && vis[x+][y+]!=-) vis[x+][y+]++;
} void _update(int x,int y)
{
vis[x][y]=;
for(int i=max(,y-);i<=min(y+,m);i++)
if(vis[x][i]>)vis[x][i]--;
for(int i=max(,x-);i<=min(n,x+);i++)
if(vis[i][y]>)vis[i][y]--;
if(vis[x-][y-]>)vis[x-][y-]--;
if(vis[x-][y+]>)vis[x-][y+]--;
if(vis[x+][y-]>)vis[x+][y-]--;
if(vis[x+][y+]>)vis[x+][y+]--;
f[x][y]=;
} void dfs(int x,int y,int L)
{
if(L==)
{
ans++;ans%=mod;
return;
}
for(int xx=x;xx<=n;xx++) for(int yy=;yy<=m;yy++)
{
if(f[xx][yy]) continue;
if(vis[xx][yy]<opt && can(xx,yy) && !f[xx][yy])
{
update(xx,yy);
f[xx][yy]=;
dfs(xx,yy,L-);
_update(xx,yy);//dfs(xx,yy,L);
}
}
} int main()
{
freopen("l.in","r",stdin);
freopen("l.out","w",stdout);
int x,y;ans=;
n=read();m=read();k=read();
for(int i=;i<=n;i++)
{
x=read();y=read();
vis[x][y]=-;
}
lim=n*m-k;
while(lim--)
{
memset(f,,sizeof f);
f[][]=;
dfs(,,lim);
}
ans%=mod;cout<<ans<<endl;
return ;
}
没调出来的dfs
#include <cstdio>
#include <cstring>
#include <vector> const int MAXN = ;
const int MOD = 1e9 + ; int m; inline unsigned int getBit(int i) {
return 1u << i;
} inline bool isValidLine(unsigned int s) {
return !((s & (s << )) || (s & (s << )));
} inline bool isValidTwoLines(unsigned int a, unsigned int b) {
return !((a & (b << )) || (a & (b >> )) || (a & b));
} inline bool isValidThreeLines(unsigned int a, unsigned int b, unsigned int c) {
return !(a & c) && isValidTwoLines(a, b)/* && isValidTwoLines(b, c)*/;
} int main() {
freopen("l.in", "r", stdin);
freopen("l.out", "w", stdout); int n, k;
scanf("%d %d %d", &n, &m, &k); unsigned int ban[n + ];
memset(ban, , sizeof(ban));
while (k--) {
int i, j;
scanf("%d %d", &i, &j);
ban[i] |= << (j - );
} std::vector<unsigned int> validStates; unsigned int maxS = << m;
for (int i = ; i < maxS; i++) {
if (isValidLine(i)) {
validStates.push_back(i);
}
} // f[i][state of line i - 1][state of line i] = count
long long f[n + ][validStates.size()][validStates.size()]; memset(f, , sizeof(f));
for (int a = ; a < (int)validStates.size(); a++) f[][][a] = ; long long ans = ;
for (int i = ; i <= n; i++) {
for (int c = ; c < (int)validStates.size(); c++) {
if (ban[i] & validStates[c]) continue;
for (int b = ; b < (i <= ? : (int)validStates.size()); b++) {
if (!isValidTwoLines(validStates[b], validStates[c])) continue;
if (ban[i - ] & validStates[b]) continue; for (int a = ; a < (i <= ? : (int)validStates.size()); a++) {
if (!isValidThreeLines(validStates[a], validStates[b], validStates[c])) continue;
if (a && (ban[i - ] & validStates[a])) continue; (f[i][b][c] += f[i - ][a][b]) %= MOD;
} if (i == n) (ans += f[i][b][c]) %= MOD;
}
}
} printf("%lld\n", ans);
}
std
暂时放弃 先做完互不侵犯king再来写这道题
10.11NOIP模拟题(3)的更多相关文章
- 10.11NOIP模拟题(2)
/* string水过 */ #include<bits/stdc++.h> #define N 1001 using namespace std; int n,x,y,m,pre; st ...
- 9.11NOIP模拟题
NOIP模拟赛 by thmyl 题目名称 superman market Lemon_Soda 可执行文件名 superman market Lemon_Soda 输入文件 superman.i ...
- 10.13NOIP模拟题
/* 容斥原理 考虑到a[i]要么不会太大,要么就对答案贡献很小 dfs即可 */ #include<bits/stdc++.h> #define ll long long #define ...
- 10.23NOIP模拟题
叉叉题目描述现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母 a 和第二次出现的 a 连一条线,第三次出现的和四次出现的字母 a 连一条线,第五次出现的和六次出现的字母 a ...
- 10.9NOIP模拟题
/* big模拟 细节不少 remove表示这个玩意儿在这一秒有没有移动 注意在一秒内所有小葱一起移动,所以如果一个一个处理 别忘了“错位”这种情况 */ #include<iostream&g ...
- 10.12NOIP模拟题(2)
/* 有谁知道这道题结论是怎么来的? 晚上问问学数学的孩子23333 */ #include<iostream> #include<cstdio> #include<cs ...
- 10.12NOIP模拟题(1)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...
- poj 1008:Maya Calendar(模拟题,玛雅日历转换)
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64795 Accepted: 19978 D ...
- poj 1888 Crossword Answers 模拟题
Crossword Answers Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 869 Accepted: 405 D ...
随机推荐
- ..net 3.5新特性之用this关键字为类添加扩展方法
具体用法如下: public static class ClassHelper { //用this 声明将要吧这个方法附加到Student对象 public static bool CheckName ...
- matplotlib的使用--折线图--入门
目录 matplotlib应用介绍 一天天气变化图 两小时随机温度图 中文显示问题 个人交往统计图 多人交往统计图 总结 介绍: 举个例子(一天天气变化图): 假设一天中每隔两个小时(range(2, ...
- Eclipse调试相关
Eclipse调试相关 F5 step into就是单步执行,遇到子函数就进入并且继续单步执行. F6 step over是在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个 ...
- MT6753/MT6755 呼吸灯功能添加
利用mtk pmic自带的呼吸灯模式: 主要修改代码: kernel-3.10/drivers/misc/mediatek/leds/mt6755/leds.c int mt_brightness ...
- LOJ#541. 「LibreOJ NOIP Round #1」七曜圣贤
有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去 ...
- Nginx 的 server_names_hash_bucket_size 问题
在 Nginx 0.6.35 的版本中,配置多个 server 虚拟主机,必须要在配置文档中 http { 里头加上 server_names_hash_bucket_size 64; 这么一句 ht ...
- SystemTap 学习笔记 - 安装篇
https://segmentfault.com/a/1190000000671438 在安装前,需要知道下自己的系统环境,我的环境如下: uname -r 2.6.18-308.el5 Linux ...
- Nginx系列(五)--nginx+tomcat实现负载均衡
Nginx占有内存少,并发能力强,其实Nginx的并发能力确实在同类型的网页伺服器中表现较好.眼下中国大陆使用Nginx站点用户有:新浪,网易,腾讯等. 本文主要是基于Nginx搭建tomcat集群. ...
- [Algorithms] Insertion sort algorithm using TypeScript
Insertion sort is a very intuitive algorithm as humans use this pattern naturally when sorting cards ...
- Xcode iOS9.3 配置包 iOS10.0 配置包 iOS10.2 配置包 could not find developer disk image
在Finder状态下前往目录.快捷键:shift+command+G,填写路径/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS ...