HDU 4911 Inversion

考点:归并排序

思路:这题呀比赛的时候忘了知道能够用归并排序算出逆序数,可是忘了归并排序的实质了。然后不会做……

由于看到题上说是相邻的两个数才干交换的时候。感觉归并排序好像不是得要相邻的呀。然后就这样晕……刚才又一次看了才发现,归并就是相邻的交换的,正好是用来求逆序数的,唉……真的是做这个归并排序比赛就来了……真好!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<limits>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define INF 510010
#define maxn 100010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll sum;
void merge(ll A[], int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
ll *L=new ll[n1 + 1];
ll *R=new ll[n2 + 1];
for(int i = 0; i < n1; i++)
L[i] = A[p + i];
for(int i = 0; i < n2; i++)
R[i] = A[q + 1 + i];
L[n1] = numeric_limits<ll>::max();
R[n2] = numeric_limits<ll>::max();
int i = 0, j = 0;
for(int k = p; k <= r; k++)
{
if(L[i] <= R[j]) A[k] = L[i],i++;
else A[k] = R[j],j++,sum += n1 - i;
}
delete []L;
delete []R;
}
void mergesort(ll A[], int l, int r)
{
if(l >= r)
return ;
int q = (l + r) / 2;
mergesort(A, l, q);
mergesort(A, q + 1, r);
merge(A, l, q, r);
}
ll a[100005];
int main()
{
//freopen("test.txt","r",stdin);
int n,k,i;
while(~scanf("%d%d",&n,&k))
{
sum=0;
for(i=0; i<n; i++)
scanf("%d",a+i);
mergesort(a,0,n-1);
if(sum>k) printf("%I64d\n",sum-k);
else puts("0");
}
return 0;
}

HDU 4920 矩阵暴力

这题绝对坑死人了,尼玛比赛的时候一直在想那个800矩阵的数据怎么过,假设数据都是1与2,模2根本就不会有0,所以不知道能用什么算法比較快,靠就这样被坑了。

看见这么多人过。还以为别人这么吊呢。靠!然后用了那个什么什么算法忘了,都是T。然后两个小时想不出来怎么搞就放弃治疗了。要是那时知道是这样搞的。尼玛,真想跳楼了比赛的时候!。!!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<limits>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define INF 510010
#define maxn 100010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int a[801][801],b[801][801],c[801][801];
int main()
{
//freopen("test.txt","r",stdin);
int n,i,j,k;
while(~scanf("%d",&n))
{
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%d",&a[i][j]),a[i][j]%=3;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%d",&b[i][j]),b[i][j]%=3,c[i][j]=0;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if(a[i][j])
for(k=0; k<n; k++)
c[i][k]=(c[i][k]+a[i][j]*b[j][k])%3;
for(i=0; i<n; i++)
{
printf("%d",c[i][0]);
for(j=1; j<n; j++)
printf(" %d",c[i][j]);
puts("");
}
}
return 0;
}

HDU 4915 模拟

这样的题有点像CF上的第二题

不机智就不会了。比赛的时候没想出好的法子来   唉……

刚才又看了好久才理解。

假设没有‘?’,问题就变成了简单的括号匹配。这个非常好推断;
每次遇到一个‘?’,我们能够先把这个‘?’变成‘(’,推断是否匹配。再把‘?’变成')',推断是否匹配。
假设都匹配,则有多种匹配方法;
假设都不匹配,则无法匹配;
假设仅仅有一个匹配,则把这个‘?’变成使之匹配的括号,然后继续推断下一个‘?'就可以。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define INF 510010
#define maxn 1000010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
char str[maxn],s[maxn];
int len;
int judge()
{
int l=0,r=0,num=0,i;//记录左、右括号和遍历过的字符数
for(i=0;i<len;i++)//从左往右推断
{
if(++num==1&&s[i]=='?') s[i]='(';
if(s[i]=='(') l++;
else if(s[i]==')') r++;
if(r>num/2) return 0;
if(r*2==num) l=r=num=0;
}
if(l>num/2) return 0; for(i=len-1,l=r=num=0;i>=0;i--)
{
if(++num==1&&s[i]=='? ') s[i]=')';
if(s[i]=='(') l++;
else if(s[i]==')') r++;
if(l>num/2) return 0;
if(l*2==num) l=r=num=0;
}
if(r>num/2) return 0;
return 1;
}
int main()
{
//freopen("test.txt","r",stdin);
while(~scanf("%s",str))
{
int flag_l,flag_r,i;
len=strlen(str);
if(len&1) {puts("None");continue;}
strcpy(s,str);
flag_l=judge();//设没有'?'
if(!flag_l) {puts("None");continue;}
for(i=0;i<len;i++)
{
if(str[i]=='? ')
{
strcpy(s,str);
s[i]=')';
flag_l=judge();
s[i]='(';
flag_r=judge();
if(flag_l&&flag_r) {puts("Many");break;};
if(!flag_l&&!flag_r) {puts("None");break;}
if(flag_l&&!flag_r) s[i]=')';
if(!flag_l&&flag_r) s[i]='(';
}
}
if(i==len) puts("Unique");
}
return 0;
}

HDU 4919 JAVA大数+记忆化递归

import java.util.*;
import java.math.*;
import java.io.*; public class Main
{
private static BigInteger one=BigInteger.ONE;
private static BigInteger two=BigInteger.valueOf(2);
private static BigInteger three=BigInteger.valueOf(3);
private static BigInteger four=BigInteger.valueOf(4);
private static BigInteger six=BigInteger.valueOf(6);
private static HashMap<BigInteger,BigInteger> map=new HashMap<BigInteger,BigInteger>();
public static BigInteger dfs(BigInteger n)
{
if(n.equals(two)) return BigInteger.ZERO;
if(n.equals(three)) return six;
if(n.equals(four)) return four;
if(map.containsKey(n)) return map.get(n);
BigInteger ans,k=n.divide(two);
if(n.mod(two).equals(one))
ans=four.multiply(dfs(k)).add(six.multiply(k));
else ans=two.multiply(dfs(k)).add(two.multiply(dfs(k.subtract(one)))).add(four.multiply(k)).subtract(four);
map.put(n,ans);
return ans;
}
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
while(cin.hasNextBigInteger())
{
BigInteger n=cin.nextBigInteger();
System.out.println(dfs(n));
}
}
}

多校第五场 归并排序+暴力矩阵乘+模拟+java大数&amp;记忆化递归的更多相关文章

  1. 2019牛客多校第五场B-generator 1(矩阵快速幂)

    generator 1 题目传送门 解题思路 矩阵快速幂.只是平时的矩阵快速幂是二进制的,这题要用十进制的快速幂. 代码如下 #include <bits/stdc++.h> #defin ...

  2. 2014多校第五场1010 || HDU 4920 Matrix multiplication(矩阵乘法优化)

    题目链接 题意 : 给你两个n*n的矩阵,然后两个相乘得出结果是多少. 思路 :一开始因为知道会超时所以没敢用最普通的方法做,所以一直在想要怎么处理,没想到鹏哥告诉我们后台数据是随机跑的,所以极端数据 ...

  3. 2014 HDU多校弟五场J题 【矩阵乘积】

    题意很简单,就是两个大矩阵相乘,然后求乘积. 用 Strassen算法 的话,当N的规模达到100左右就会StackOverFlow了 况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存 ...

  4. 2014 HDU多校弟五场A题 【归并排序求逆序对】

    这题是2Y,第一次WA贡献给了没有long long 的答案QAQ 题意不难理解,解题方法不难. 先用归并排序求出原串中逆序对的个数然后拿来减去k即可,如果答案小于0,则取0 学习了归并排序求逆序对的 ...

  5. 2018杭电多校第五场1002(暴力DFS【数位】,剪枝)

    //never use translation#include<bits/stdc++.h>using namespace std;int k;char a[20];//储存每个数的数值i ...

  6. generator 1(2019年牛客多校第五场B题+十进制矩阵快速幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...

  7. 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂

    理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...

  8. 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化

    B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...

  9. hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力

    题意: 定义一个排列的差分为后一项减前一项之差构成的数列,求对于n个数的排列,差分的字典序第k小的那个,n<=20,k<=1e4. 题解: 暴力打表找一遍规律,会发现,对于n个数的排列,如 ...

随机推荐

  1. 关于JSP post请求乱码的问题

    解决用户请求页面乱的问题 1. 修改apache下的config文件夹下的server.XML文件 <Connector connectionTimeout="20000" ...

  2. ELK 之一:ElasticSearch 基础和集群搭建

    一:需求及基础: 场景: 1.开发人员不能登录线上服务器查看详细日志 2.各个系统都有日志,日志数据分散难以查找 3.日志数据量大,查询速度慢,或者数据不够实时 4.一个调用会涉及到多个系统,难以在这 ...

  3. windows下apache如何完整卸载?

    1.运行services.msc,在服务中停止 apache 服务.2.运行命令行程序,输入 sc delete apache,删除该服务3.删除apache文件夹.

  4. hdu 1075 What Are You Talking About(字典树)

    刚学的字典树,代码写得很不熟练.写法上也没有什么特别的优化,就是以1A为第一目标! 可惜还是失败了. 少考虑了一种情况,就是一个单词是另一个单词前缀的问题,写了好久,还是没有1A.不过感觉对字典树有了 ...

  5. Mnesia基本用法

    查看表结构 查看mnesia表的结构: mnesia:info(). 查看此表的基本信息: mnesia:table_info(<tableName>, all). Mnesia初使化 m ...

  6. IOS系统对fixed定位支持不好的解决方法

    问题: IOS 中所有浏览器,当页面上的输入框获得焦点时,呼出键盘. 页面底部的导航栏(position:fixed)会被键盘顶到页面的中间. 而当输入框失去焦点时,导航栏停留在页面中间,造成页面错乱 ...

  7. SignalR 聊天室实例详解(服务器端推送版)

    翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room  (在这里可以下载到实例的源码) Asp.Net Si ...

  8. C++操作符的优先级

    C++操作符的优先级 C++操作符的优先级 操作符及其结合性 功能 用法 L L L :: :: :: 全局作用域 类作用域 名字空间作用域 ::name class::name namespace: ...

  9. 学习笔记之NodeJs基本操作

    nodejs安装见文章:windows下安装node.js及less 运行js文件:node xxx.js 调用http模块,并指定端口为3000,向客户端输出<h1>Node.js< ...

  10. hdu1104 Remainder bfs找算式是否有解……

    须要注意的是,进行模运算剪枝-- #include<iostream> #include<queue> #include<cstdlib> #include< ...