Mango Weekly Training Round #6 解题报告
比赛链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=41856#overview
A.多种解法。可以dfs倒序染色,如mathlover神的代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
int x1,y1,x2,y2;
bool color;
} a[];
int n,m;
int ans;
void dfs(int x1,int y1,int x2,int y2,bool color,int num)
{
if(num==m)
{
if(color)
ans+=(y2-y1+)*(x2-x1+);
return;
}
if(x1>a[num].x2||x2<a[num].x1||y2<a[num].y1||y1>a[num].y2)
{
dfs(x1,y1,x2,y2,color,num+);
return;
}
if(x1<a[num].x1)
dfs(x1,y1,a[num].x1-,y2,color,num+);
if(x2>a[num].x2)
dfs(a[num].x2+,y1,x2,y2,color,num+);
if(y1<a[num].y1)
dfs(max(x1,a[num].x1),y1,min(x2,a[num].x2),a[num].y1-,color,num+);
if(y2>a[num].y2)
dfs(max(x1,a[num].x1),a[num].y2+,min(x2,a[num].x2),y2,color,num+);
}
int main()
{
char temp;
while(~scanf("%d%d",&n,&m))
{
for(int i=; i<m; ++i)
{
scanf("%d %d %d %d %c",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2,&temp);
a[i].color=(temp=='b');
if(a[i].x1>a[i].x2)
swap(a[i].x1,a[i].x2);
if(a[i].y1>a[i].y2)
swap(a[i].y1,a[i].y2);
}
ans=;
for(int i=m-; i>=; --i)
dfs(a[i].x1,a[i].y1,a[i].x2,a[i].y2,a[i].color,i+);
printf("%d\n",n*n-ans);
}
}
//GL && HF
但是暴力貌似也可以过,上暴力代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1007 int a[N][N]; int main()
{
int n,m,i,j,tag,cnt;
int x1,x2,y1,y2;
char ss[];
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,,sizeof(a));
cnt = ;
while(m--)
{
scanf("%d%d%d%d%s",&x1,&y1,&x2,&y2,ss);
int maxx = max(x1,x2);
int maxy = max(y1,y2);
int minx = min(x1,x2);
int miny = min(y1,y2);
if(ss[] == 'b')
tag = ;
else
tag = ;
for(i=minx;i<=maxx;i++)
for(j=miny;j<=maxy;j++)
a[i][j] = tag;
}
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
cnt += -a[i][j];
}
printf("%d\n",cnt);
}
return ;
}
B.数学方法(等我弄懂了再写一个容易懂的)
C.生成排列,自行询问或找题解
D.归并排序或者树状数组求逆序对数
这个应该是非常经典的经典题,用归并排序求逆序数。
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
算法描述
归并操作的工作原理如下:
- 申请空间,归并排序需要一个辅助数组,大小和要排序的数组相同。
- 若选取的范围内的元素个数大于等于2,则进行分治。
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置。
- 比较两个指针所指向的元素,选择相对小的元素放入到辅助数组,并移动指针到下一位置。
- 重复步骤4直到某一指针达到序列尾。
- 将另一序列剩下的所有元素直接复制到辅助数组中。
- 将辅助数组中的元素复制到原数组。
归并排序代码:(By hlove)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define maxn 65555
using namespace std; int num[maxn],temp[maxn],n; long long Merge(int low,int mid,int high)
{
int i=low,j=mid+,cnt=low;
long long count=;;
while(i<=mid&&j<=high){
if(num[i]>num[j]){temp[cnt++]=num[j++];count+=mid-i+;}
else temp[cnt++]=num[i++];
}
while(i<=mid)temp[cnt++]=num[i++];
while(j<=high)temp[cnt++]=num[j++];
for(i=low;i<=high;i++)num[i]=temp[i];
return count;
}
long long mergesort(int low,int high)
{
long long cnt=;
if(high>low){
int mid = (high+low)/;
cnt+=mergesort(low,mid);
cnt+=mergesort(mid+,high);
cnt+=Merge(low,mid,high);
}
return cnt;
}
int main()
{
while(scanf("%d",&n)==){
for(int i=;i<n;i++){
scanf("%d",&num[i]);
}
printf("%lld\n",mergesort(,n-));
}
return ;
}
树状数组代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 66007 lll c[N],k[N];
int n;
struct node
{
lll val;
int ind;
}a[N]; int cmp(node ka,node kb)
{
return ka.val < kb.val;
} lll lowbit(lll x)
{
return x&(-x);
} void modify(lll x)
{
while(x <= n)
{
c[x]++;
x += lowbit(x);
}
} lll sum(lll x)
{
lll res = ;
while(x > )
{
res += c[x];
x -= lowbit(x);
}
return res;
} int main()
{
lll x,cnt;
int i;
while(scanf("%d",&n)!=EOF)
{
memset(c,,sizeof(c));
cnt = ;
for(i=;i<=n;i++)
{
scanf("%I64d",&a[i].val);
a[i].ind = i;
}
sort(a+,a+n+,cmp);
lll pre = -,now = ;
for(i=;i<=n;i++)
{
if(a[i].val != pre)
{
pre = a[i].val;
a[i].val = now++;
}
else
a[i].val = now-;
}
for(i=;i<=n;i++)
k[a[i].ind] = a[i].val;
for(i=;i<=n;i++)
{
modify(k[i]);
cnt += i - sum(k[i]);
}
printf("%I64d\n",cnt);
}
return ;
}
关于树状数组求逆序对数: http://hi.baidu.com/sculiunian/item/2d0c9bd6340396f2785daa71
E.找循环节,一直计算Xi,由于m在1000内,所以到某个时刻总会出现前面已出现的的值,即形成循环节,用con记录Xi何时出现,初始化为-1,con[A] = 0; 计算到Xi时,如果con[Xi]已经出现,说明开始循环了。找出循环起点与循环长度,然后看k在那一段,根据循环找出x[k]..具体键代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1007 int con[N];
lll x[N];
int main()
{
lll alpha,beta,gamma,m;
int k,a;
while(scanf("%d%I64d%I64d%I64d%I64d%d",&a,&alpha,&beta,&gamma,&m,&k)!=EOF)
{
x[] = a;
int i = ;
int qi,len;
memset(con,-,sizeof(con));
con[a%m] = ;
if(k == )
{
printf("%d\n",a);
continue;
}
i = ;
while()
{
x[i] = (alpha*x[i-]*x[i-] + beta*x[i-] + gamma)%m;
if(con[x[i]] == -)
con[x[i]] = i;
else
{
qi = con[x[i]];
len = i-qi;
if(k >= qi)
k = qi+(k-qi)%len;
break;
}
i++;
}
printf("%I64d\n",x[k]);
}
return ;
}
F.搜索,自寻题解
G.DP优化
mathlover代码:
#include <stdio.h>
#include<algorithm>
#define M 105
#define N 10005
int n, m,dp[M][M],c[N];
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i)
scanf("%d",&c[i]);
for (int i=;i<=n+;++i)
for (int j=;j<m;++j)
{
int tmp =(i-j+M)%M;
dp[i%M][j]=dp[tmp][m-j]+c[i];
if (j != )
dp[i%M][j]=std::min(dp[i%M][j],dp[i%M][j-]);
}
printf("%d\n",dp[(n+)%M][m-]);
return ;
}
H.大水题。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1007 int main()
{
int p,m,c,k,r,v;
while(scanf("%d%d%d%d%d%d",&p,&m,&c,&k,&r,&v)!=EOF)
{
int res1 = p/k;
int res2 = m/r;
int res3 = c/v;
printf("%d\n",min(res1,min(res2,res3)));
}
return ;
}
I.网络流,自寻题解:https://www.google.com.hk/#newwindow=1&q=SGU+185&safe=strict
J.题目有点难懂,重点是理解,题目说的合并链子不是直接连上,而是要从别的地方取一个珠子来作为中介来连接两条链子,这样,每次在长度最短的链子中取珠子,说不定就可以减少链子的条数,岂不是可以减少时间。。好,就这么干。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1007 int a[]; int main()
{
int n,i,x;
while(scanf("%d",&n)!=EOF)
{
for(i=;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int head = ;
int tail = n-;
int step = ;
while(head < tail)
{
a[head]--; //最短的链子上的珠子减1
if(a[head] <= ) //这条链没了
head++;
int tmp = a[tail] + a[tail-] + ; //合并两条链,加不加1都可以
a[--tail] = tmp;
step++;
}
printf("%d\n",step);
}
return ;
}
Mango Weekly Training Round #6 解题报告的更多相关文章
- Mango Weekly Training Round #3 解题报告
A. Codeforces 92A Chips 签到题.. #include <iostream> #include <cstdio> #include <cstring ...
- Codeforces Round #300 解题报告
呜呜周日的时候手感一直很好 代码一般都是一遍过编译一遍过样例 做CF的时候前三题也都是一遍过Pretest没想着去检查... 期间姐姐提醒说有Announcement也自信不去看 呜呜然后就FST了 ...
- BestCoder Round #86 解题报告
A.Price List Sol 求和查询 Code #include<cstdio> #include<algorithm> #include<iostream> ...
- BestCoder Round #75 解题报告
King's Cake [思路] 递推 公式:f(n,m)=f(max(m,n-m),min(m,n-m))+1,n>m [代码] #include<cstdio> #include ...
- BestCoder Round #76 解题报告
DZY Loves Partition [思路] 贪心 [代码] #include <iostream> using namespace std; typedef long long ll ...
- Codeforces Global Round 1 解题报告
A 我的方法是: #include<bits/stdc++.h> using namespace std; #define int long long typedef long long ...
- 浙江省队选拔 ZJOI2015 (Round 1) 解题报告
最近莫名其妙地喜欢上了用这种格式写各省省选的全套题解= = 今年浙江省选的出题人是算法竞赛界传说级人物陈立杰,看样子他的出题风格很有特点……ABC三题难度是严格递减的,感觉如果在做第一题的时候被卡住的 ...
- BestCoder Round #40 解题报告
这场是第一场没有米的BC... 大概也是想震一震那些一听说没米了就不打BC的人吧 这次的题目质量比以往高了许多 (然而我并没有打这一场BC 但是今天下午到现在做的过程中真的学到了不少知识呢 A题略水. ...
- Codeforces Round #302 解题报告
感觉今天早上虽然没有睡醒但是效率还是挺高的... Pas和C++换着写... 544A. Set of Strings You are given a string q. A sequence o ...
随机推荐
- NYOJ 42 一笔画问题
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- .net mysql 支持表情
1.表 utf8mb4 2.字段 utf8mb4 3.连接字符串 utf8mb4 4.存储过程参数 utf8mb4
- javascript宿主对象之window.navigator
window.navigator用来反映浏览器及其功能信息的对象. // 检测浏览器版本信息 function getBrowserInfo(){ var Sys = {}; var ua = win ...
- javamail 发送邮件demo
package com.suntray.test; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.M ...
- 实战3--应用EL表达式判断用户登录信息
1.判断用户名是否为空,空则显示提示信息 (1)编写index.jsp页面 <%@ page language="java" contentType="text/h ...
- C实现通用数据结构--单链表
单链表概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 从概念上讲,可以把链表想象成一系列连续的元素,然而,由于这些元素是动态分配的(C语言 ...
- 【读书笔记】iOS-AppKit简介
一,IBOutlet和IBAction.它们实际上只是AppKit提供的#defines.IBOutlet的含义没有任何作用,因此将不对对它时行编译.IBAction定义为void,这意味着在AppC ...
- iOS 工厂方法模式
iOS工厂方法模式 什么是工厂方法模式? 工厂方法模式和简单工厂模式十分类似,大致结构是基本类似的.不同在于工厂方法模式对工厂类进行了进一步的抽象,将之前的一个工厂类抽象成了抽象工厂和工厂子类,抽象工 ...
- [android] 手机卫士自定义对话框布局
手机防盗页面部分 点击手机防盗,进行判断,如果没有设置密码,显示一个设置密码的对话框,如果已经设置密码了,弹出输入密码对话框 密码保存在SharedPreferences中,数据取出进行判断 自定义一 ...
- Mac上的软件的一些对开发者有用的使用技巧(持续更新)
内容大纲: Google浏览器设置开发者模式 正文: 1.Google浏览器设置开发者模式