hdu多校5
1002
思路:贪心显然不好贪,直接爆搜。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int>
#define y1 skldjfskldjg
#define y2 skldfjsklejg using namespace std; const int N = 1e5 + ;
const int M = 1e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 +; int x, k, mx, mn, Mn, Mx;
string s; void getMx(string &a, int pos, int k, int n) {
if(mx == Mx) return;
if(k == || pos == n) {
int val = ;
for(int i = ; i < n; i++) {
val *= ;
val += a[i] - '';
}
mx = max(mx, val);
return;
}
char val = '';
for(int i = n - ; i > pos; i--) val = max(val, a[i]);
if(val <= a[pos]) {
getMx(a, pos + , k, n);
} else {
for(int i = n - ; i > pos; i--) {
if(a[i] == val) {
swap(a[i], a[pos]);
getMx(a, pos + , k - , n);
swap(a[i], a[pos]);
}
}
}
} void getMn(string &a, int pos, int k, int n) {
if(mn == Mn) return;
if(k == || pos == n) {
int val = ;
for(int i = ; i < n; i++) {
val *= ;
val += a[i] - '';
}
mn = min(mn, val);
return;
} if(pos == ) {
char val = '';
for(int i = n - ; i > pos; i--) if(a[i] != '') val = min(val, a[i]);
if(val >= a[pos]) {
getMn(a, pos + , k, n);
} else {
for(int i = n - ; i > pos; i--) {
if(a[i] == val) {
swap(a[i], a[pos]);
getMn(a, pos + , k - , n);
swap(a[i], a[pos]);
}
}
}
} else { char val = '';
for(int i = n - ; i > pos; i--) val = min(val, a[i]);
if(val >= a[pos]) {
getMn(a, pos + , k, n);
} else {
for(int i = n - ; i > pos; i--) {
if(a[i] == val) {
swap(a[i], a[pos]);
getMn(a, pos + , k - , n);
swap(a[i], a[pos]);
}
}
}
}
} int main() {
int T; scanf("%d", &T);
while(T--) {
mn = inf;
mx = -inf;
Mx = Mn = ;
cin >> s >> k;
string a = s, b = s;
sort(s.rbegin(), s.rend());
for(int i = ; i < s.size(); i++) {
Mx *= ;
Mx += s[i] - '';
}
sort(s.begin(), s.end()); if(s[] == '') {
for(int i = ; i < s.size(); i++) {
if(s[i] != '') {
swap(s[], s[i]);
break;
}
}
}
for(int i = ; i < s.size(); i++) {
Mn *= ;
Mn += s[i] - '';
}
getMx(a, , k, s.size());
getMn(b, , k, s.size());
printf("%d %d\n", mn, mx);
}
return ;
} /*
*/
1007
思路:线段树剪剪枝,标程好像是用st表压标记。
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define ui unsigned int
#define vi vector<int>
#define mod 1000000007
#define ld long double
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define fio ios::sync_with_stdio(false);cin.tie(0)
template<typename T>
inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>
inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
inline void sub(ll &a,ll b){a-=b;if(a<)a+=mod;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll qp(ll a,ll b){ll ans=;while(b){if(b&)ans=ans*a%mod;a=a*a%mod,b>>=;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=;while(b){if(b&)ans=ans*a%c;a=a*a%c,b>>=;}return ans;} using namespace std; const double eps=1e-;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=+,maxn=+,inf=0x3f3f3f3f; unsigned int x,y,z;
int n,m;
unsigned int gao()
{
x=x^(x<<);
x=x^(x>>);
x=x^(x<<);
x=x^(x>>);
unsigned int w=x^(y^z);
x=y;
y=z;
z=w;
return z;
}
ui val[N<<],lazy[N<<];
void build(ui l,ui r,int rt)
{
val[rt]=lazy[rt]=;
if(l==r)return ;
ui m=(l+r)>>;
build(ls),build(rs);
}
void update(ui L,ui R,ui c,ui l,ui r,int rt)
{
if(lazy[rt]>c)return ;
if(L<=l&&r<=R)
{
lazy[rt]=MAX(lazy[rt],c);
if(lazy[rt]>val[rt])val[rt]=lazy[rt];
return ;
}
ui m=(l+r)>>;
if(L<=m)update(L,R,c,ls);
if(m<R)update(L,R,c,rs);
}
void pushdown(ui l,ui r,int rt)
{
ui m=(l+r)>>;
if(l==m)val[rt<<]=MAX(val[rt<<],lazy[rt]);
if(m+==r)val[rt<<|]=MAX(val[rt<<|],lazy[rt]);
lazy[rt<<]=MAX(lazy[rt<<],lazy[rt]);
lazy[rt<<|]=MAX(lazy[rt<<|],lazy[rt]);
lazy[rt]=;
}
ull ans;
void query(ui l,ui r,int rt)
{
if(l==r)
{
ans^=(1ull*l*val[rt]);
return ;
}
pushdown(l,r,rt);
ui m=(l+r)>>;
query(ls),query(rs);
}
int main()
{
fio;
int T;cin>>T;
while(T--)
{
cin>>n>>m>>x>>y>>z;
build(,n,);
for(int i=;i<m;i++)
{
ui a=gao(),b=gao(),c=gao();
ui l=MIN(a%n+,b%n+),r=MAX(a%n+,b%n+),v=c%(<<);
update(l,r,v,,n,);
}
ans=;
query(,n,);
cout<<ans<<"\n";
}
return ;
}
/******************** ********************/
1005
思路:简单计算几何? 我们队好像写的很麻烦。。。
#include<bits/stdc++.h>
using namespace std;
const double pi=acos(-);
struct Point
{
double x, y;
Point(double x = , double y = ) :x(x), y(y) {}
}; typedef Point Vector; Vector operator - (Point A, Point B)
{
return Vector(A.x - B.x, A.y - B.y);
} Vector operator + (Vector A, Vector B)
{
return Vector(A.x + B.x, A.y + B.y);
} Vector operator * (Vector A, double p)
{
return Vector(A.x * p, A.y * p);
} Vector operator / (Vector A, double p)
{
return Vector(A.x / p, A.y / p);
} double Dot(Vector A,Vector B)
{
return A.x * B.x + A.y * B.y;
} double Length(Vector A)
{
return sqrt(Dot(A,A));
} double Angle(Vector A,Vector B) //求角度
{
return acos(Dot(A,B) / Length(A) / Length(B));
} double angle(Vector v)
{
return atan2(v.y,v.x);
} const double eps = 1e-;
int dcmp(double x)
{
if(fabs(x) < eps) return ;
else
return x < ? - : ;
} bool operator < (const Point& a,const Point& b)
{
return a.x < b.x || (a.x == b.x && a.y < b.y);
} bool operator == (const Point& a,const Point &b)
{
return dcmp(a.x - b.x) == && dcmp(a.y - b.y) == ;
} struct Circle
{
Point c;
double r; Circle(Point c, double r) :c(c), r(r) {}
Point point(double a)
{
return Point(c.x + cos(a) * r, c.y + sin(a) * r);
}
}; int getCircleCircleIntersection(Circle C1,Circle C2,vector<Point>& sol) //求圆和圆的交点
{
double d = Length(C1.c - C2.c);
if(dcmp(d) == ) //首先圆心要重合
{
if(dcmp(C1.r - C2.r) == ) return -; //其次半径要相同,然后就可以推出两圆重合
return ;
}
if(dcmp(C1.r + C2.r - d) < ) return ; //相离没交点
if(dcmp(fabs(C1.r - C2.r) - d) > ) return ; //圆在圆中,没有交点 double a = angle(C2.c - C1.c); //向量C1C2的极角
double da = acos((C1.r * C1.r + d * d - C2.r * C2.r) / ( * C1.r * d)); //C1C2到C1P1的角
Point p1 = C1.point(a-da),p2 = C1.point(a+da); sol.push_back(p1);
if(p1 == p2) return ; //相切
sol.push_back(p2);
return ; //相交
} double Pointlen(Point a,Point b){
double res= sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
return res;
} double ans; bool OnCircle(Point x,Circle y){
double len=(x.x-y.c.x)*(x.x-y.c.x)+(x.y-y.c.y)*(x.y-y.c.y);
if(len<=y.r*y.r) return true;
return false;
} double dot(Point a, Point b) {
return a.x * b.x + a.y * b.y;
} int main(){
int T;scanf("%d",&T);
while(T--){
int n;
double xx;
scanf("%d%lf",&n,&xx);
Circle ori((Point){,},xx); ans=2.0*pi*ori.r; for(int i=;i<n;i++){
vector<Point> inter; double tx,ty,tr;
scanf("%lf%lf%lf",&tx,&ty,&tr);
Circle tc((Point){tx,ty},tr); int num=getCircleCircleIntersection(ori,tc,inter); if(num==||num==-) continue;
else if(num==){
if(OnCircle(tc.c,ori))
ans+=2.0*tc.r*pi;
}
else{ double plen=Pointlen(inter[],inter[])/2.0; double slen=2.0*ori.r*asin(plen/ori.r);
double llen=2.0*pi*ori.r-2.0*ori.r*asin(plen/ori.r); Point mid;
mid.x=(inter[].x+inter[].x)/2.0;
mid.y=(inter[].y+inter[].y)/2.0; double len1=Pointlen(ori.c,mid);
double len2=Pointlen(tc.c,ori.c);
double an1= 2.0*tc.r*asin(plen/tc.r);
double an2=2.0*pi*tc.r - 2.0*tc.r*asin(plen/tc.r); if(dot(mid - ori.c, tc.c - ori.c) >= ) {
if(len1 <= len2) {
ans -= min(slen, llen);
ans += min(an1, an2);
} else {
ans -= min(slen, llen);
ans += max(an1, an2);
}
} else {
ans -= max(slen, llen);
ans += min(an1, an2);
} }
}
printf("%.12f\n",ans); } }
/*
100
1 2.717
-1 0 2.717
*/
补题*********************************************************
1008
思路:感觉这题应该想的出来的,但是比赛确实是没想出来,枚举反转的值,然后去dp。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int, int>
#define y1 skldjfskldjg
#define y2 skldfjsklejg using namespace std; const int N = 1e5 + ;
const int M = 1e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 +; int n, l, r, ans, tot, p1[], p2[], dp[N][], a[N], f[N][][];
char s[N]; void solve(int S, int T) {
tot = ;
memset(p1, -, sizeof(p1));
memset(p2, -, sizeof(p2));
for(int i = ; i <= S; i++) p1[i] = tot++;
for(int i = T; i >= S; i--) p2[i] = tot++;
for(int i = T; i < ; i++) p1[i] = tot++;
for(int i = ; i < tot; i++) dp[][i] = , f[][i][] = f[][i][] = -; for(int i = ; i <= n; i++) {
for(int j = ; j < tot; j++) {
dp[i][j] = dp[i - ][j];
f[i][j][] = f[i - ][j][];
f[i][j][] = f[i - ][j][];
if(j && dp[i][j] < dp[i][j - ]) {
dp[i][j] = dp[i][j - ];
f[i][j][] = f[i][j - ][];
f[i][j][] = f[i][j - ][];
}
if(p1[a[i]] != - && dp[i - ][p1[a[i]]] + > dp[i][p1[a[i]]]) {
dp[i][p1[a[i]]] = dp[i - ][p1[a[i]]] + ;
f[i][p1[a[i]]][] = f[i - ][p1[a[i]]][];
f[i][p1[a[i]]][] = f[i - ][p1[a[i]]][];
}
if(p2[a[i]] != - && dp[i - ][p2[a[i]]] + > dp[i][p2[a[i]]]) {
dp[i][p2[a[i]]] = dp[i - ][p2[a[i]]] + ;
if(f[i][p2[a[i]]][] == -) f[i][p2[a[i]]][] = i;
f[i][p2[a[i]]][] = i;
}
}
}
if(dp[n][tot - ] > ans) {
ans = dp[n][tot - ];
if(f[n][tot - ][] != -) {
l = f[n][tot - ][];
r = f[n][tot - ][];
} else {
l = ;
r = ;
}
}
} int main() {
int T; scanf("%d", &T);
while(T--) {
ans = ;
scanf("%d%s", &n, s + );
for(int i = ; i <= n; i++) a[i] = s[i] - ''; for(int i = ; i < ; i++) {
for(int j = i; j < ; j++) {
solve(i, j);
}
}
printf("%d %d %d\n", ans, l, r);
}
return ;
} /*
*/
hdu多校5的更多相关文章
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 2015 HDU 多校联赛 5363 Key Set
2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...
- 2015 HDU 多校联赛 5317 RGCDQ 筛法求解
2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目 http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...
- [HDU多校]Ridiculous Netizens
[HDU多校]Ridiculous Netizens 点分治 分成两个部分:对某一点P,连通块经过P或不经过P. 经过P采用树形依赖背包 不经过P的部分递归计算 树型依赖背包 v点必须由其父亲u点转移 ...
- 【杂题总汇】HDU多校赛第十场 Videos
[HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...
- hdu多校1002 Balanced Sequence
Balanced Sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s) ...
- HDU多校(Distinct Values)
Problem Description Chiaki has an array of n positive integers. You are told some facts about the ar ...
- hdu多校6
这个场要恶心死我了.. 1001 积分题,不要四舍五入 //#pragma comment(linker, "/stack:200000000") //#pragma GCC op ...
- hdu 多校第一场
1001 思路:打表可以发现只有3|n 和 4|n 的情况有解,判一下就好啦. #include<bits/stdc++.h> #define LL long long #define f ...
随机推荐
- 关于我之前写的修改Windows系统Dos下显示的用户名之再修改测试
最近看到蛮多网友反映,自己修改Dos下用户名后出现了很多的问题--今天抽了时间,再次修改测试... ================= 提前说明:我自己修改了很多次没发现任何问题,<为避免修改可 ...
- android设计准则
------------缘由-------------------------------------------------------------------------------------- ...
- 【Foreign】Uria [欧拉函数]
Uria Time Limit: 20 Sec Memory Limit: 512 MB Description 从前有个正整数 n. 对于一个正整数对 (a,b),如果满足 a + b ≤ n 且 ...
- 【NOIP】提高组2013 积木大赛
[算法]找规律(听说还有写RMQ的www) [题解]ans+=(a[i]-a[i-1]) (i=1...n)(a[i]>a[i-1]) 后面比前面大k,说明要新叠加k个区间来达到所需高度.(看 ...
- vue-awesome-swipe 基于vue使用的轮播组件 使用(改)
npm install vue-awesome-swiper --save //基于vue使用的轮播组件 <template> <swiper :options="swi ...
- hdu 2545 树上战争(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2545 树上战争 Time Limit: 10000/4000 MS (Java/Others) ...
- Xutils使用详解
刚开始的时候,在 GitHub 上面出现了一款强大的开源框架叫 xUtils,里面包含了很多实用的android工具,并且支持大文件上传,更全面的 http 请求协议支持(10种谓词),拥有更加灵活的 ...
- Eureka服务下线(Cancel)源码分析
Cancel(服务下线) 在Service Provider服务shut down的时候,需要及时通知Eureka Server把自己剔除,从而避免其它客户端调用已经下线的服务,导致服务不可用. co ...
- 多github帐号的SSH key切换
我有两个github帐号,一个是个人所用,一个是为公司项目所用.如果是单用户(single-user),很方便,默认拿id_rsa与你的github服务器的公钥对比:如果是多用户(multi-user ...
- thread线程栈size及局部变量最大可分配size【转】
转自:http://blog.csdn.net/sunny04/article/details/46805261 版权声明:本文为博主原创文章,未经博主允许不得转载. 进程是操作系统的最小资源管理单元 ...