T1 入阵曲

前缀和维护可以得60分 f[x1][y1][x2][y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];  O(n4)

如果同一行的两个前缀和在模k意义下相等,那么他们之间的数的和一定是k的整数倍。把余数拿桶存起来,每次查询之前相同余数的有几个,直接加上。把一行拓展成许多行。

枚举矩阵的左右端点,中间的连续几列压成一列,(然后可以把纸旋转90°)就跟一行的一样了。复杂度O(n3)

需要注意的一点是初始化桶t[0]=1 因为如果这一整块本来就在模k意义下为0,用前缀和求这一段的和需要q[x]-q[0],而q[0]=0,需要把他也放进去。

桶里的东西怎么放进去的怎么拿出来。

ans要开long long

#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
int n,m,k,a[][],sum[][],t[],q[];
ll ans;
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc<=''&&cc>=''){aa=(aa<<)+(aa<<)+(cc^);cc=getchar();}
return aa*bb;
}
int main()
{
n=read();m=read();k=read();
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
a[i][j]=read()%k;
sum[i][j]=(sum[i][j-]+a[i][j])%k;
}
}
for(int i=;i<=m;i++){
for(int j=i;j<=m;j++){
q[]=;t[q[]]=;
for(int l=;l<=n;l++){
q[l]=(q[l-]+sum[l][j]-sum[l][i-]+k)%k;
ans+=t[q[l]];
t[q[l]]++;
}
for(int l=;l<=n;l++) t[q[l]]=;
}
}
printf("%lld\n",ans);
return ;
}

入阵曲

T2 将军令

贪心

找到深度最深的节点,向上找距离他为k的节点,没有就是根,在这驻扎一定优于在这下面的节点,因为越往上他的拓展性越强。

所以每次找到没有被控制的最深的节点,向上找到能控制他且距离最远的祖先,控制他,祖先点亮造成的其他儿子被控制,直接dfs找到并标记,统计答案。

每次贪心的题都不会太难,难的是能想到贪心并且正确实现。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
int to,nxt;
}h[];
int n,k,t,tot,ans,nxt[],dep[],f[];
priority_queue< pair<int,int> >q;
bool vis[],flag;
vector<int>ve[];
void add(int x,int y)
{
h[++tot].to=y;
h[tot].nxt=nxt[x];
nxt[x]=tot;
}
void dfs(int x)
{
for(int i=nxt[x];i;i=h[i].nxt){
int y=h[i].to;
if(dep[y]) continue;
dep[y]=dep[x]+;
q.push(make_pair(dep[y],y));
f[y]=x;
dfs(y);
}
}
void dfs1(int x,int d,int fa)
{
if(d>=k) return;
for(int i=nxt[x];i;i=h[i].nxt){
int y=h[i].to;
if(y==fa) continue;
vis[y]=;
dfs1(y,d+,x);
}
}
int main()
{
scanf("%d%d%d",&n,&k,&t);
int u,v;
for(int i=;i<=n-;i++){
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
q.push(make_pair(,));
dep[]=;
dfs();
while(q.size()){
int d=q.top().first,x=q.top().second;
q.pop();
if(!vis[x]){
int fa=x;
for(int i=;i<=k;i++){
if(fa==) break;
fa=f[fa];
}
vis[fa]=;
dfs1(fa,,);
ans++;
}
}
printf("%d\n",ans);
return ;
}

将军令

T3 星空

卡了一下午,有点难过

把亮不亮抽象成01串,没点亮为1,点亮为0(反过来不好做)。区间取反可以用差分单点修改。c[i]=a[i]^a[i+1] c数组为差分数组,下标从0开始。

我们要的最终状态是所有灯都点亮,即全部为0,对应到差分数组上也是全部为0。

因为一共有k个没被点亮,和左边的0会在差分数组里得到一个1,右边同理也会得到一个。所以差分数组里最多有2*k个1。

区间翻转操作在差分数组里就变成了单点修改。翻转[2,4],就是单点修改1和4。

下面的操作均在差分数组上进行

假设我们操作的区间的端点是0和1,把0变成1,1变成0,及相当于1跳了b[i]的距离去找了0,代价为1;如果两个1相遇了,那么就全部翻转,全部变为0(消没了)。所以这就是1跳一跳去找另一个1的问题。。。

考虑在序列上建边,每个点跑b[i]的距离能到达哪,跑最短路。

剩下的就是状压了,把2*k个1状压,看那两个点匹配去消除。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct node
{
int to,nxt;
}h[];
int n,k,m,a[],b[],c[],tot,nxt[],dis[][],cnt,f[(<<)+],pos[(<<)+];
vector<int>ve;
bool vis[];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y)
{
h[++tot].to=y;
h[tot].nxt=nxt[x];
nxt[x]=tot;
}
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc<=''&&cc>=''){aa=(aa<<)+(aa<<)+(cc^);cc=getchar();}
return aa*bb;
}
void dj(int p)
{
memset(vis,,sizeof(vis));
queue<int> q;
dis[p][ve[p]]=;
vis[ve[p]]=;
q.push(ve[p]);
while(q.size()){
int x=q.front();q.pop();vis[x]=;
for(int i=nxt[x];i;i=h[i].nxt){
int y=h[i].to;
if(dis[p][y]>=dis[p][x]+){
dis[p][y]=dis[p][x]+;
if(!vis[y]){
vis[y]=;
q.push(y);
}
}
}
}
}
int main()
{
memset(dis,0x3f,sizeof(dis));
memset(f,0x3f,sizeof(f));
n=read();k=read();m=read();
int cc;
for(int i=;i<=k;i++){
cc=read();
a[cc]=;
}
for(int i=;i<=m;i++) b[i]=read();
for(int i=;i<=n;i++){
c[i]=a[i]^a[i+];
if(c[i]) ve.push_back(i);
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(i-b[j]>=) add(i,i-b[j]);
if(i+b[j]<=n) add(i,i+b[j]);
}
}
cnt=ve.size();
for(int i=;i<=cnt;i++) pos[<<i]=i;
for(int i=;i<cnt;i++) dj(i);
cnt=(<<cnt)-;
f[cnt]=;
for(int i=cnt;i>=;i--){
for(int j=i;j;j-=lowbit(j)){
int x=lowbit(j);
for(int l=j-x;l;l-=lowbit(l)){
int y=lowbit(l);
f[i-x-y]=min(f[i-x-y],f[i]+dis[pos[x]][ve[pos[y]]]);
// cout<<i-x-y<<" "<<pos[x]<<" "<<pos[y]<<" "<<dis[pos[y]]<<" "<<f[i]<<" "<<f[i-x-y]<<endl;
}
}
}
printf("%d\n",f[]);
return ;
}

星空

出题人好像很喜欢五月天的样子。。。

8.11 NOIP模拟测试17 入阵曲+将军令+星空的更多相关文章

  1. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  2. NOIP模拟测试17「入阵曲&#183;将军令&#183;星空」

    入阵曲 题解 应用了一种美妙移项思想, 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k==0$可以转化为 $sum[r]\% k==sum[l-1]\%k$开个桶维护一 ...

  3. NOIP模拟测试17

    T1:入阵曲 题目大意:给定一个N*M的矩形,问一共有多少个子矩形,使得矩形内所有书的和为k的倍数. 60%:N,M<=80 枚举矩形的左上角和右下角,用二维前缀和求出数字之和. 时间复杂度$O ...

  4. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  5. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  6. 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色

    2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)

    2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...

  8. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  9. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

随机推荐

  1. tomcat正常运行一段时间后,突然访问不了项目了

    前言 我将项目部署在tomcat服务器上,本来都是好好的,输入网站地址就能访问:但是第二天一早去就会发现网站访问提示404,文件无法找到:我就很懵了. 排查 1.我是用的是chrome浏览器,所以尝试 ...

  2. LeetCode28——实现strStr()

    6月中下旬辞职在家,7 月份无聊的度过了一个月.8 月份开始和朋友两个人写项目,一个后台和一个 APP ,APP 需要对接蓝牙打印机.APP 和蓝牙打印机都没有搞过,开始打算使用 MUI 开发 APP ...

  3. 修改centos服务器时区并同步最新时间

    rm -rf /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ntpdate cn.pool.ntp.org ...

  4. 移动端js触摸touch详解(附带案例源码)

    移动端触摸滑动原理详解案例,实现过程通过添加DOM标签的触摸事件监听,并计算触摸距离,通过距离坐标计算触摸角度,最后通过触摸角度去判断往哪个方向触摸的. 触摸的事件列表 触摸的4个事件: touchs ...

  5. perf性能调优

    工具准备 ubuntu:sudo apt-get install perf 嵌入式平台:下载源码编译 注意:编译过程中会有Auto-detectiing system feature的依赖库打印,注意 ...

  6. CodeForce 117C Cycle DFS

    A tournament is a directed graph without self-loops in which every pair of vertexes is connected by ...

  7. 【Java面试题】short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

    昨天去面试,虽然体验不是很好, 但是看到了这个面试题,当时感觉无从下手,所以在这里记录一下. 解决这道题之前,先复习一下Java的基本数据类型转换规则,以便后面对面试题的理解. java的基本数据类型 ...

  8. SpringBoot多数据源动态切换数据源

    1.配置多数据源 spring: datasource: master: password: erp_test@abc url: jdbc:mysql://127.0.0.1:3306/M201911 ...

  9. jQuery HTML/CSS 方法大全

    下表列出了用于操作HTML和CSS的所有方法. 方法 描述 addClass() 向所选元素添加一个或多个类名 after() 在所选元素之后插入内容 append() 在所选元素的末尾插入内容 ap ...

  10. python3访问限制

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...